【发布时间】: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