【问题标题】:Spring autowiring keeps JMockit mocks around for other testsSpring 自动装配让 JMockit 模拟其他测试
【发布时间】: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


    【解决方案1】:

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

    如果您想在测试类之间重置应用上下文。

    【讨论】:

    • 正是我正在寻找的东西,但是没有多少谷歌搜索向我透露!非常感谢!
    【解决方案2】:

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

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

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

    【讨论】:

    • 要点,理想情况下每个类都应该完全隔离测试。但是为所有东西实现注入有时是不切实际的(恕我直言)。就我而言,我确实返回并开始从测试类中删除所有自动装配,并对所有内容使用模拟。但是被测类做了一些文件和流操作,所以模拟很快就变得比代码本身更复杂。
    • 我很想听听其他人关于在单元测试中使用 Spring 和自动装配的信息。再一次,我可以理解使用 none 的纯粹方法,但是在单元测试中使用 Spring 的实用性真的是一件坏事吗?毕竟,应用程序使用的是 Spring,所以不应该对连接进行测试吗?
    • 如果您意识到设置被测系统太难了,那么您应该尝试更改它,因为依赖项太多:-)
    猜你喜欢
    • 1970-01-01
    • 2022-11-26
    • 2018-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-29
    • 2011-04-09
    • 2011-12-29
    相关资源
    最近更新 更多