我正在使用Groovy编写的Spock测试来测试一些Java代码。由于Spock只处理Groovy类,因此我使用JMockit来模拟Java代码中的方法。我遇到了一个问题,即JMockit的MockUp在测试之间持久存在。根据JMockit文档,这样的模拟实例应该仅存在于测试中,但这并没有起作用,我想这是因为它没有使用JMockit测试运行器,而是使用了Spock测试运行器。
下面是我面临的问题的最简单示例。我有一个简单的方法返回一个字符串,我可以使用MockUp更改方法的返回值,但它仍然存在于第三个测试中,而该测试不希望使用它。 Java类:
下面是我面临的问题的最简单示例。我有一个简单的方法返回一个字符串,我可以使用MockUp更改方法的返回值,但它仍然存在于第三个测试中,而该测试不希望使用它。 Java类:
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方法被调用了两次。
问题
在JMockit中是否有手动删除一个类MockUp
的方法?谢谢。
instance.method() >> result
,您能指点我正确的方向吗? - mndMock
实例化对象了,像这样ClassToTest instance = Mock(ClassToTest)
。现在要想办法将其变成部分模拟,可能需要使用 Spy。 - mndSpy()
是最好的选择。通常情况下,重构被测试的代码或重新考虑测试的内容/方式会更好。 - Peter Niederwieser