我正在尝试对一个类(比如说“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,像它被告知的那样注入模拟,然后只是重用相同的 ClassUnderTest 对象进行下一次测试。我如何将它们分开?如何为每个单独的测试文件获取“新鲜”对象?我没有得到什么/谷歌搜索?
我已经尝试了在 Expectations 块中定义对象的多种变体并使用 @Tested/@Injected 但没有运气。顺便说一句,我避免在其他测试中嘲笑 Helper,因为我需要它来做它的事情。ClassUnderTest 还会自动装配一堆其他对象,而这些对象又会自动装配其他对象,因此模拟 ClassUnderTest 引用的所有内容是不切实际的。
任何见解,哦,知识渊博的 Stack Overflow Magic 8 Ball?(“稍后再试”是不可接受的。)