春季-使用模拟单元测试-如何在服务单元测试中模拟自定义收集器

时间:2019-09-20 16:14:40

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

我有一个烦人的问题。

我有一个服务(用在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()之外,其他都没有意义。

我不想减少测试范围。 我应该如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

单元测试背后的想法是您原子地测试您的方法。但这并不意味着您将必须模拟其中的所有其他方法调用。

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

此外,只要您的自定义收集器具有自己的单元测试,这也就不会影响您的覆盖范围