2

在 Spring 中,在对象上运行一堆测试方法但在每次新测试方法调用之前重置/重新注入对象的最佳方法是什么?我尝试在下面的代码中执行此操作,但使用我当前的逻辑,该对象仅被创建和注入一次。

package com.bidtracker;

import org.junit.Test;
import org.junit.runner.RunWith;

import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.is;

import com.bidtracker.iface.BidTracker;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class BidTrackerTest {

    @Autowired
    BidTracker tracker;

    @Test
    public void shouldReturnHighestBidAmount1(){

    tracker.bidOnItem("itemB", "user1", 105);
    assertThat(tracker.getHighestBid("itemB").getAmount(),is(Integer.valueOf(105)));
    }

    @Test
    public void shouldReturnHighestBidAmount2(){

    tracker.bidOnItem("itemB", "user1", 39); 
    tracker.bidOnItem("itemB", "user1", 50); 

    assertThat(tracker.getHighestBid("itemB").getAmount(),is(Integer.valueOf(50)));

    }
}
4

2 回答 2

1

JUnit 有@Before注解,你可以在每次测试之前使用它来做任何初始化。

不过,我对你的情况很好奇。这是来自@Test文档:

Test 注释告诉 JUnit,它所附加的公共 void 方法可以作为测试用例运行。为了运行该方法,JUnit 首先构造一个新的类实例,然后调用带注释的方法。测试抛出的任何异常都会被 JUnit 报告为失败。如果没有抛出异常,则假定测试成功。

我猜这个问题是bean是一个单例。它实际上再次被注入,但如果它被修改过,你使用的是相同的东西。您可以尝试@DirtiesContext注释。

于 2013-01-23T00:45:07.760 回答
1

这里的问题是 Spring 测试支持默认缓存应用程序上下文,如果键的元素匹配(上下文名称、活动配置文件等),将重用缓存的上下文。要让 Spring 从缓存中删除上下文,您可以使用@DirtiesContext注释标记测试(在方法级别或测试类级别)。

于 2013-01-23T00:58:26.123 回答