首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JMockit MockUp在斯波克测试之间坚持

JMockit MockUp在斯波克测试之间坚持
EN

Stack Overflow用户
提问于 2014-12-31 18:22:03
回答 2查看 1.6K关注 0票数 4

我使用用Groovy编写的Spock测试来测试一些Java代码。我使用JMockit来模拟java代码中的方法,因为Spock只处理模拟Groovy类。我遇到了一个问题,一个JMockit MockUp在测试之间持久化。这样的模拟实例应该只存在于测试(每个JMockit文档),但这是行不通的,我认为这是因为它没有使用JMockit测试运行程序,而是使用了JMockit测试运行程序。

这是我所面临问题的最简单的例子。我有一个返回字符串的简单方法,我可以用MockUp更改方法的返回值,但是对于第三个测试,它仍然存在,这并不期望它被使用。

Java类

代码语言:javascript
复制
public class ClassToTest {
    public String method() {
        return "original";
    }
}

史波克测试

代码语言:javascript
复制
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?谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-01 14:03:51

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

票数 4
EN

Stack Overflow用户

发布于 2014-12-31 19:30:07

不能完全回答这个问题,因为我仍然不知道是否可以手动删除JMockit的MockUp。但是,由于@PeterNiederwieser的评论,我发现您实际上可以为Java类创建部分模拟。下面是对第二次测试的更改。

代码语言:javascript
复制
void "second test"() {
    setup:
    ClassToTest test = Spy(ClassToTest) {
        method() >> "mocked"
    }

    when:
    String result = test.method()

    then:
    result == "mocked"
}

Peter提到重新考虑如何以及如何测试Spy()是否是必要的,但是对于我的用例来说,这是首选。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27724875

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档