首页 文章

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

提问于
浏览
2

我'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 回答

  • 2

    您可以在创建的模型对象上调用MockUp.tearDown方法,以手动撤消其效果 .

  • 1

    不完全是问题的答案 - 因为我仍然可以手动删除't know if JMockit' s MockUp . 但是感谢@ PeterNiederwieser的评论,我发现你实际上可以为Java类创建一个局部模拟 . 以下是从上面进行的第二次测试的变化 .

    void "second test"() {
        setup:
        ClassToTest test = Spy(ClassToTest) {
            method() >> "mocked"
        }
    
        when:
        String result = test.method()
    
        then:
        result == "mocked"
    }
    

    彼得提到重新考虑如何测试如何以及测试什么,但对于我的用例,这是首选 .

相关问题