【发布时间】:2013-04-19 21:49:41
【问题描述】:
我正在尝试对一个类(比如说“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? (“稍后再试”是不可接受的。)
【问题讨论】:
标签: java spring unit-testing autowired jmockit