弹簧单元测试和物体重新注入

时间:2013-01-23 00:43:06

标签: spring unit-testing

在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)));

    }
}

2 个答案:

答案 0 :(得分:1)

JUnit具有@Before注释,您可以在每次测试之前使用它进行任何初始化。

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

  

Test annotation告诉JUnit公共void方法到哪个   附加可以作为测试用例运行。要运行该方法,请使用JUnit   首先构造一个新的类实例然后调用   注释方法。将报告测试引发的任何异常   由JUnit作为失败。如果没有抛出异常,那么测试就是   假设已经成功。

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

答案 1 :(得分:1)

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