我正在尝试对一个类进行单元测试(比方说,“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? (“稍后尝试”是不可接受的。)
答案 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)
如果要重置测试类之间的应用程序上下文。