2

我正在尝试对一个类(比如说“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?(“稍后再试”是不可接受的。)

4

2 回答 2

2

Annotate the test class with

@DirtiesContext(classMode = AFTER_CLASS)

if you want to reset the app context between test classes.

于 2013-04-19T23:01:47.950 回答
2

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

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

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

于 2013-04-19T21:55:45.243 回答