2013-01-23 50 views
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))); 

    } 
} 

回答

1

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

+0

谢谢你解决了我的问题。然而,我很好奇,Spring是否认为这种测试公式不好(脏)? – jule64

+1

我认为没关系,从头开始创建应用程序上下文代价很高,这就是为什么Spring测试倾向于跨越测试缓存它的原因(如果套件中有多个测试类使用相同的上下文,它将被重用整个套房)。但是,如果绝对需要重新创建上下文,@DirtiesContext的选项始终存在:-) –

1

的JUnit有@Before注释,您可以使用每个测试之前做初始化。

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

测试注解告诉公众无效的方法,其 它连接可以运行一个测试案例的JUnit。为了运行该方法,JUnit 首先构造该类的新实例,然后调用 带注释的方法。由测试抛出的任何异常将被JUnit报告为 作为失败。如果没有抛出异常,则假定测试 已成功。

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

+0

我不喜欢克隆这个对象。我更喜欢在每次调用时重新创建/重新注入对象 – jule64