我使用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()
仍然返回String&#34; mocked&#34;而不是&#34;原始&#34;。使用调试器我已经验证了Mocked方法被调用了两次。
问题
有没有办法在JMockit中手动删除类MockUp
?感谢。
答案 0 :(得分:3)
您可以在创建的模型对象上调用MockUp.tearDown方法,以手动撤消其效果。
答案 1 :(得分:1)
不完全是问题的答案 - 因为我仍然不知道是否可以手动删除JMockit的MockUp
。但是感谢@ PeterNiederwieser的评论,我发现你实际上可以为Java类创建一个局部模拟。以下是对上述第二次测试的更改。
void "second test"() {
setup:
ClassToTest test = Spy(ClassToTest) {
method() >> "mocked"
}
when:
String result = test.method()
then:
result == "mocked"
}
彼得提到重新考虑如果需要Spy()
如何以及如何测试,但对于我的用例,这是首选。