Spring自动装配让JMockit嘲笑其他测试

时间:2013-04-19 21:49:42

标签: java spring unit-testing autowired jmockit

我正在尝试对一个类进行单元测试(比方说,“ClassUnderTest”)以及它对特定库类的使用(让我们称之为“Helper”)。所以我将一个模拟的Helper注入ClassUnderTest并使用Expectations来检查。

 public class TestUseOfHelper {
     @Autowired ClassUnderTest classUnderTest;
     @Mocked    HelperClass    helper;
 [...]
     @Before
     public void setUp() throws Exception {
         Deencapsulation.setField(classUnderTest, "helper", helper);
     }
 [...]
     @Test
     public void test() {
         new Expectations() {{
             helper.doSomething(any);
         }};

         classUnderTest.useHelper();
    }

到目前为止,这么好。

在其他测试中(相同的包,不同的文件),我正在测试ClassUnderTest的其他方面,我只想让Helper做它的事情。

 public class TestOtherQualities {
     @Autowired ClassUnderTest classUnderTest;
 [...]
     @Test
     public void test() {
        result = classUnderTest.processSomething();
        assertNonNull(result);
    }

这些测试也很好。

当我运行测试套件时会出现问题。现在,第二组失败了,显然是因为Mocked Helper仍然存在!

我假设整个套件正在同一个JVM中执行,并且Spring已经创建了一个ClassUnderTest,就像它告诉的那样注入了mock,但是然后只重复使用相同的ClassUnderTest对象进行下一次测试。我如何将它们分开?如何为每个单独的测试文件获取“新鲜”对象?我没有得到什么/谷歌搜索?

我尝试过在Expectations块中定义对象的多种变体,并使用@Tested / @Injected但没有运气。顺便说一下,我在其他测试中避免嘲笑助手,因为我需要它做它的事情。 ClassUnderTest还会自动装配一堆其他对象,这些对象又会自动装配其他对象,因此模拟ClassUnderTest引用的所有对象都是不切实际的。

任何见解,知识渊博的Stack Overflow Magic 8 Ball? (“稍后尝试”是不可接受的。)

2 个答案:

答案 0 :(得分:2)

这是一个单元测试。因此,您根本不应该使用Spring来创建和自动装配对象。只需在每次需要时创建一个新的ClassUnderTest,并手动注入模拟依赖项:

@Before
public void setUp() {
    this.classUnderTest = new ClassUnderTest();
    Deencapsulation.setField(classUnderTest, "helper", mockHelper);
}

注意:我不知道JMockit,它可能有注释,甚至自动创建一个新的注入模拟依赖项。我的回答是,Spring应该不符合单元测试的要求。这是依赖注入的主要优点:能够创建要测试的对象实例,并能够手动注入模拟依赖项。

答案 1 :(得分:2)

使用

注释测试类
@DirtiesContext(classMode = AFTER_CLASS)

如果要重置测试类之间的应用程序上下文。