【问题标题】:JMockit MockUp persisting between Spock testsJMockit MockUp 在 Spock 测试之间持续存在
【发布时间】:2015-02-27 18:21:10
【问题描述】:

我正在使用用 Groovy 编写的 Spock 测试来测试一些 Java 代码。我使用 JMockit 来模拟 Java 代码中的方法,因为 Spock 只处理模拟 Groovy 类。我遇到了一个问题,即 JMockit MockUp 在测试之间持续存在。这样的模拟实例应该只存在于测试中(根据 JMockit 文档),但这不起作用,我想这是因为它没有使用 JMockit 测试运行器,而是使用 Spock 测试运行器。

这是我所面临问题的最简单示例。我有一个简单的方法返回一个字符串,我可以用MockUp改变方法的返回值但是第三次​​测试它仍然存在,不希望它被使用。

Java 类

public class ClassToTest {
    public String method() {
        return "original";
    }
}

Spock 测试

class ClassToTestSpec extends Specification {
    void "first test"() {
        when:
        String result = new ClassToTest().method()

        then:
        result == "original"
    }

    void "second test"() {
        setup:
        new MockUp<ClassToTest>() {
            @Mock
            public String method() {
                return "mocked"
            }
        }

        when:
        String result = new ClassToTest().method()

        then:
        result == "mocked"
    }

    void "third test"() {
        when:
        String result = new ClassToTest().method()

        then:
        result == "original"
    }
}

第三次测试失败,因为ClassToTest.method() 仍然返回字符串“mocked”而不是“original”。使用调试器,我已经验证了 Mocked 方法被调用了两次。

问题

有没有办法在 JMockit 中手动删除类 MockUp?谢谢。

【问题讨论】:

  • Spock 可以模拟 Java 和 Groovy 类。嘲笑被测类是一种气味,应该小心使用。
  • 感谢@PeterNiederwieser 的回复,我无法使用正常的符号instance.method() &gt;&gt; result,您能指出正确的方向吗?
  • 从头开始,符号确实有效,我忘记用Mock 实例化对象,例如ClassToTest instance = Mock(ClassToTest)。现在要弄清楚如何使它成为部分模拟,可能使用间谍。
  • 如果你绝对需要/想要一个半模拟,Spy() 是要走的路。通常最好重构被测代码或重新考虑测试什么/如何测试。

标签: groovy spock jmockit


【解决方案1】:

不完全是问题的答案 - 因为我仍然不知道是否可以手动删除 JMockit 的 MockUp。但是感谢@PeterNiederwieser 的cmets,我发现您实际上可以为Java 类创建部分模拟。下面是上面第二个测试的变化。

void "second test"() {
    setup:
    ClassToTest test = Spy(ClassToTest) {
        method() >> "mocked"
    }

    when:
    String result = test.method()

    then:
    result == "mocked"
}

Peter 提到重新考虑如何测试以及测试 Spy() 是否必要,但对于我的用例而言,这是首选。

【讨论】:

    【解决方案2】:

    您可以在创建的模型对象上调用 MockUp.tearDown 方法,以手动撤消其效果。

    【讨论】:

    • 太棒了!谢谢@Rogerio!
    • 就我个人而言,我在 spock 测试中使用 tearDown 方法没有运气。如果有人得到这个工作,我想看一个示例规范。谢谢。至于现在,我正在避免使用 spock 中的 Jmockit。
    • 从 JMockit 1.28 开始,此答案不再有效,因为 MockUp#tearDown 已被删除。
    猜你喜欢
    • 1970-01-01
    • 2022-01-19
    • 2020-09-05
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    • 2020-08-24
    相关资源
    最近更新 更多