我正在使用用Groovy编写的Spock测试来测试一些Java代码。我使用JMockit来模拟java代码中的方法,因为Spock只处理嘲笑的Groovy类。我遇到了测试之间存在JMockit MockUp
的问题。这样的模拟实例应该只存在于测试中(根据JMockit文档),但这不起作用,我想这是因为它没有使用JMockit测试运行器,而是使用Spock测试运行器。JMockit MockUp坚持Spock测试
这是我面临的问题的最简单的例子。我有一个简单的方法返回一个字符串,我可以用MockUp
更改该方法的返回值,但它仍然存在第三个测试,它不会被使用。
的Java类
public class ClassToTest {
public String method() {
return "original";
}
}
斯波克测试
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方法被调用两次。
问题
有什么办法来手动删除JMockit类MockUp
?谢谢。
Spock可以模拟Java和Groovy类。嘲笑被测试的班级是一种气味,应该小心使用。 –
感谢@PeterNiederwieser的回应,我无法使用正常表示法'instance.method()>> result',你能指出我的方向吗? – mnd
临时表示符号工作,我忘了用'Mock'实例化对象,比如'ClassToTest instance = Mock(ClassToTest)'。现在要弄清楚如何使这个部分模拟,可能与间谍。 – mnd