当前位置: 首页 > 知识库问答 >
问题:

在Spock测试之间持久化的JMockit模型

宋博易
2023-03-14

我正在使用一个用Groovy编写的Spock测试来测试一些Java代码。我使用JMockit来模拟java代码中的方法,因为Spock只处理模拟Groovy类。我遇到了一个问题,在测试之间存在一个JMockitmockup。这样的模拟实例应该只存在于测试中(根据JMockit文档),但这不起作用,我想这是因为它没有使用JMockit测试运行器,而是使用了Spock测试运行器。

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"
    }
}

问题

有什么方法可以手动移除JMockit中的类mockup吗?谢了。

共有1个答案

阎昌勋
2023-03-14

这并不完全是问题的答案--因为我仍然不知道JMockit的模型是否可以手动删除。但是由于@PeterniederWieser的评论,我发现您实际上可以为Java类创建部分模拟。下面是从上面到第二个测试的变化。

void "second test"() {
    setup:
    ClassToTest test = Spy(ClassToTest) {
        method() >> "mocked"
    }

    when:
    String result = test.method()

    then:
    result == "mocked"
}

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

 类似资料:
  • 问题内容: 如何保持在unitttest中继承的同一对象内所做的更改? 即:我希望以上两项测试通过 问题答案: 正如一些评论所回响的那样,以这种方式构造测试可能是测试本身的设计缺陷,您应该考虑对其进行重组。但是,如果您要执行此操作,并且依赖于所使用的测试运行程序以字母(看似)顺序执行它们的事实,那么我建议以下内容。 类似于@Matthias所说的,但是对于以后您可能决定从该类继承的情况,我会做不同

  • 注意:如果我不使用JMockit,我可以进行调试,但是在生产代码中测试方法需要使用这个方法。 关于如何让调试器从使用JMockit的Spock测试中停在Java代码中,有什么想法吗?

  • 校验者: @why2lyj(Snow Wang) @小瑶 翻译者: @那伊抹微笑 在训练完 scikit-learn 模型之后,最好有一种方法来将模型持久化以备将来使用,而无需重新训练。 以下部分为您提供了有关如何使用 pickle 来持久化模型的示例。 在使用 pickle 序列化时,我们还将回顾一些安全性和可维护性方面的问题。 3.4.1. 持久化示例 可以通过使用 Python 的内置持久化

  • 英文原文:http://emberjs.com/guides/models/persisting-records/ Ember Data中的记录都基于实例来进行持久化。调用DS.Model实例的save()会触发一个网络请求,来进行记录的持久化。 下面是几个示例: 1 2 3 4 5 6 var post = store.createRecord('post', { title: 'Rail

  • 问题内容: 这是一个关于如何将cookie从一个casperjs页持久化到另一个页面的问题。 所以基本上我得到了一个nodejs文件,该文件生成casperjs作为工作人员执行某些任务。一个是登录,一旦登录,我就将cookie存储在文件中。 当我产生下一个Casper工人时..我希望它使用Cookie而不是再次登录..这两种方法均 失败 : 第一: 当我生成worker capserjs时,我添加

  • 概念 之前的消息应答部分已经看到了如何处理消息不丢失的情况,但是如何保障当 RabbitMQ服务停掉之后消息生产者发送过来的消息不丢失呢? 默认情况下,RabbitMQ退出或者由于某种原因崩溃的时候,它会忽视队列和消息,除非告知它不要这样做。 确保消息不会丢失需要做两件事:将队列和消息都标记为持久化。 队列实现持久化 之前创建的队列都是非持久化的,RabbitMQ如果重启,该队列就会被删掉,如果要