【发布时间】: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() >> result,您能指出正确的方向吗? -
从头开始,符号确实有效,我忘记用
Mock实例化对象,例如ClassToTest instance = Mock(ClassToTest)。现在要弄清楚如何使它成为部分模拟,可能使用间谍。 -
如果你绝对需要/想要一个半模拟,
Spy()是要走的路。通常最好重构被测代码或重新考虑测试什么/如何测试。