【问题标题】:Spring - Unit Test with Mock - How to mock a Custom Collector in a Service unit testSpring - 带有 Mock 的单元测试 - 如何在服务单元测试中模拟自定义收集器
【发布时间】:2023-04-01 01:10:01
【问题描述】:

我有一个烦人的问题。

我有一个服务(在 RestController 中使用),它从存储库中获取数据并对获取的数据进行一些转换。我在转换中使用自定义收集器。所以它看起来像:

@RestController
class myController() {
    Service myService

    @GetMapping()
    void getResults{
       Collection col = myService.fetch();
       // some file download logic
    }

}

@Service
class myService() {
Repository repository
Collector myCollector

    Collection fetch() {
    return repository
        .getSomeResults()
        .stream()
        .collect(Collectors.groupingBy(someKey, myCollector)
        .values();
    }

}

在这里,当我想对服务方法 fetch() 进行单元测试时,我可以模拟存储库,但如果我想模拟自定义收集器,我需要对所有 5 个方法进行存根。除了finish(),其他的mock都没什么意义。

我不想减少测试覆盖率。 我应该如何解决这个问题?

【问题讨论】:

  • 如果在自定义收集器上调用真实方法会发生什么?它只会收集从模拟存储库返回的数据。你的问题到底是什么?你有什么问题吗?
  • 我告诉你不需要模拟自定义收集器,只需模拟存储库和剩余流程应该顺利@Melih
  • 你不必真正嘲笑它。如果您使用像 Collectors.summingInt() 这样的开箱即用实现,您会因为您不只是测试您的方法而模拟它吗?那为什么要模拟你的自定义收集器呢?
  • 不要注入它...它应该像Java的Collectors.toSet()、Collectors.toList()这样的静态方法
  • 单元测试背后的想法是您以原子方式测试您的方法。但这并不意味着您必须在内部模拟所有其他方法调用。说,你有一个数据库调用/网络调用,模拟它是有意义的。但在这种情况下,它与模拟 Collectors.toList() 类似。在这里不嘲笑它并没有什么坏处。只要您的 Collector 有自己的单元测试,这不会以任何方式影响您的覆盖范围。

标签: java spring unit-testing mocking domain-driven-design


【解决方案1】:

单元测试背后的理念是您以原子方式测试您的方法。但这并不意味着您必须在内部模拟所有其他方法调用。

说,你有一个数据库调用/网络调用,模拟它是有意义的。当被调用方法的响应决定将在被调用方法上执行的分支时,模拟是有意义的。但在这种情况下,它类似于模拟Collectors.toList()。在这里不嘲笑它并没有什么坏处。

此外,只要您的自定义收集器有自己的单元测试,这无论如何都不会影响您的覆盖率

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-12
    • 1970-01-01
    • 2021-11-07
    • 2021-09-18
    • 2016-04-10
    相关资源
    最近更新 更多