【问题标题】:Unit testing a service, which works as a mediator between two other services对服务进行单元测试,该服务充当其他两个服务之间的中介
【发布时间】:2013-07-24 08:24:07
【问题描述】:
我有一个服务,它充当其他两个服务之间的中介。它基本上验证输入,然后将它们按顺序传递给这两个服务(通过尝试保持事务完整性),然后,如果一切顺利,将结果保存到数据库中。
我现在的问题是单独测试这个服务。当然,我可以提供存根来满足依赖关系。我还可以测试输入的验证,在正常情况下是否将适当的数据保存在数据库中,以及是否在任何依赖项抛出异常时保持事务完整性。
然而,这只是服务实际功能的一半。我的困境是我是否应该尝试证明其他两个依赖服务是否实际上也适当地处理了数据?我的服务范围很广,所以我想最好也知道依赖服务是否也做得很好。然而,这超出了单元测试的范围,进入了集成测试,对吧?
我有点困惑。
【问题讨论】:
标签:
java
unit-testing
testing
junit
【解决方案1】:
如果您询问的是单元测试,那么这样做的方法是使用模拟或存根单独测试类。
但是,如果您觉得仅仅这样做还不够,您可以编写一些 component 测试,在其中使用您想要测试的所有真实类,并使用存根(或内存) 数据库并模拟一些您认为对您要测试的内容不重要的依赖项。
过去,我以这种方式测试了它们之间具有高度交互性的类的小集群(有时会跳过这些类的单元测试,因为组件测试涵盖了所有场景)。显然,这样做的问题在于,随着您测试的类越多,场景的数量几乎呈指数增长。也许你可以测试一下桥和使用该桥的 2 个真实类。
【解决方案2】:
你应该两者都做。
对于单元测试,绝对使用模拟对象作为依赖项,最好使用像EasyMock 这样的工具。作为旁注,如果您觉得中介服务的功能过于广泛而无法进行单元测试,您可能需要考虑将其分解为更小的部分。
当然,您还应该使用真正的依赖项进行集成测试,以确保您的服务按预期协同工作。