JMockit MockUp在Spock测试之间持续存在

时间:2014-12-31 18:22:03

标签: groovy spock jmockit

我使用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?感谢。

2 个答案:

答案 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()如何以及如何测试,但对于我的用例,这是首选。