我使用用Groovy编写的Spock测试来测试一些Java代码。我使用JMockit来模拟java代码中的方法,因为Spock只处理模拟Groovy类。我遇到了一个问题,一个JMockit MockUp在测试之间持久化。这样的模拟实例应该只存在于测试(每个JMockit文档),但这是行不通的,我认为这是因为它没有使用JMockit测试运行程序,而是使用了JMockit测试运行程序。
这是我所面临问题的最简单的例子。我有一个返回字符串的简单方法,我可以用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()仍然返回字符串“模拟”而不是“原始”。使用调试器,我验证了模拟方法被调用了两次。
问题
是否有任何方法手动删除类MockUp中的JMockit?谢谢。
发布于 2015-01-01 14:03:51
您可以在创建的mockup对象上调用MockUp.tearDown方法,手动撤消其效果。
发布于 2014-12-31 19:30:07
不能完全回答这个问题,因为我仍然不知道是否可以手动删除JMockit的MockUp。但是,由于@PeterNiederwieser的评论,我发现您实际上可以为Java类创建部分模拟。下面是对第二次测试的更改。
void "second test"() {
setup:
ClassToTest test = Spy(ClassToTest) {
method() >> "mocked"
}
when:
String result = test.method()
then:
result == "mocked"
}Peter提到重新考虑如何以及如何测试Spy()是否是必要的,但是对于我的用例来说,这是首选。
https://stackoverflow.com/questions/27724875
复制相似问题