【问题标题】:Different expectations during mocking嘲笑期间的不同期望
【发布时间】:2020-03-24 06:16:25
【问题描述】:

我正在测试我的消息的过滤。 只有当 id 不存在时才会保存消息。

List<Message> messages = ninitializedDto.stream()
        .filter(message -> !messageRepository.existsById(message.getId())
        .map(this::initializeMessage)
        .collect(Collectors.toList());

return messageRepository.saveAll(messages);

但在我的 Spock 测试中,大小始终返回 1。(即使我在返回之前打印了 messages.size()(它返回 0)

def "createMessages should filter and save only messages that does not exist yet"() {
        given:
        UninitializedDto dto = Mock()
        dto.getId() >> 2L

        List<UninitializedDto> messageDtos = [dto]

        messageRepository.existsById(dto.getId()) >> true

        when:
        initialize.createMessages(messageDtos)

        then:
        1 * messageRepository.saveAll(_) >> {
            List<Message> savedMessageList ->
                assert savedMessageList.size() == 0
        }
    }

【问题讨论】:

    标签: java unit-testing java-stream spock


    【解决方案1】:

    想通了。存在将列表参数包装在另一个列表中的错误。

    1 * messageRepository.saveAll(_) >> {
        List<Message> savedMessageList ->
        List<Message> messageList = savedMessageList.get(0) as List<Message>
    
        assert savedMessageList.size() == 0
    }
    

    【讨论】:

    • 为什么不修复应用程序中的错误,而不是编写一个测试来证明错误实际上是错误,通过通过测试来证明错误行为?编写测试的目的之一不就是发现这些问题然后解决它们吗?
    • @kriegaex 错误是 Spock。不是我们的应用程序。嗯?
    • 您的意思是您的测试中存在错误,对吗?不在Spock本身。我想我们在这里误会了。
    • @kriegaex 这个错误是 Spock 的。我相信。由于函数saveAll() 的预期输入只是List&lt;Message&gt;(JPA 存储库),因此出于某种原因,它将列表包装到另一个列表中。所以 Lambda 的结果(由于某种原因)变成了 List&lt;List&lt;Message&gt;&gt; 我希望我解释正确。感谢您的评论。
    • 我仍然认为这个错误不在 Spock 中。但是,如果您不分享,我几乎无法对您的受试班级发表任何明智的看法。如果您拒绝将您的问题编辑为MCVE,即一组自洽的类,我可以在不丢失任何依赖项的情况下对其进行编译,然后针对它运行测试,我无法向您证明我是对的。你也不能。让代码说话,猜测一无所获​​。真相就在代码中,那你为什么不分享呢?没有包名或类名,缺少方法等。
    猜你喜欢
    • 2016-07-29
    • 1970-01-01
    • 2016-11-18
    • 1970-01-01
    • 2019-11-08
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多