我'm using a Spock test written in Groovy to test some Java code. I'使用JMockit来模拟java代码中的方法,因为Spock只处理模拟Groovy类 . 我遇到了JMockit MockUp
在测试之间持续存在的问题 . 这样的模拟实例应该仅用于测试(根据JMockit文档),但这不是't working, and I imagine it',因为它不使用JMockit测试运行器,而是使用Spock测试运行器 .
这是我面临的问题最简单的例子 . 我有一个简单的方法返回一个字符串,我可以用 MockUp
更改方法的返回值,但它仍然存在于第三个测试,它不期望它被使用 .
Java Class
public class ClassToTest {
public String method() {
return "original";
}
}
Spock Test
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方法被调用两次 .
Question
有没有办法在JMockit中手动删除类 MockUp
?谢谢 .
2 回答
您可以在创建的模型对象上调用MockUp.tearDown方法,以手动撤消其效果 .
不完全是问题的答案 - 因为我仍然可以手动删除't know if JMockit' s
MockUp
. 但是感谢@ PeterNiederwieser的评论,我发现你实际上可以为Java类创建一个局部模拟 . 以下是从上面进行的第二次测试的变化 .彼得提到重新考虑如何测试如何以及测试什么,但对于我的用例,这是首选 .