【发布时间】:2018-09-10 10:33:50
【问题描述】:
最近我们在系统开发过程中遇到了一些冲突。我们发现,我们的团队有 3 种不同的测试方法,我们需要确定哪种方法最好,并检查是否有比这更好的方法。
首先,让我们面对一些事实:
- 我们在系统中有 3 个数据层(DTO、域对象、表)
- 我们使用由 mapstruct 生成的映射器将每一层的对象映射到另一个
- 我们正在使用 mockito
- 我们正在对每一层进行单元测试
现在的冲突:假设我们要测试ExampleService,它使用ExampleModelMapper 将ExampleModel 映射到ExampleModelDto,并执行一些需要测试的额外业务逻辑。我们可以通过三种不同的方式验证返回数据的正确性:
a) 我们可以手动将返回对象的每个字段与预期结果进行比较:
assertThat(returnedDto)
.isNotNull()
.hasFieldOrPropertyWithValue("id", expectedEntity.getId())
.hasFieldOrPropertyWithValue("address", expectedEntity.getAddress())
.hasFieldOrPropertyWithValue("orderId", expectedEntity.getOrderId())
.hasFieldOrPropertyWithValue("creationTimestamp", expectedEntity.getCreationTimestamp())
.hasFieldOrPropertyWithValue("price", expectedEntity.getPrice())
.hasFieldOrPropertyWithValue("successCallbackUrl", expectedEntity.getSuccessCallbackUrl())
.hasFieldOrPropertyWithValue("failureCallbackUrl", expectedEntity.getFailureCallbackUrl())
b) 我们可以使用真正的映射器(与正常逻辑相同)来比较两个对象:
assertThat(returnedDto).isEqualToComparingFieldByFieldRecursivly(mapper.mapToDto(expectedEntity)))
c) 最后,我们可以模拟映射器及其响应:
final Entity entity = randomEntity();
final Dto dto = new Dto(entity.getId(), entity.getName(), entity.getOtherField());
when(mapper.mapToDto(entity)).thenReturn(dto);
我们希望使测试尽可能好,同时保持它们的弹性和抗变化性。我们也想保持 DRY 原则。
我们很高兴听到每种方法的任何建议、cmets、优缺点。我们也愿意看到任何其他解决方案。
您好。
【问题讨论】:
-
也许你可以在这里找到一些灵感:youtube.com/watch?v=2vEoL3Irgiw(在 45 分钟内改进你的测试驱动开发 - Jakub Nabrdalik)也许还有一些事实需要调整,比如“我们正在对每个我们的图层”...
-
这意味着我们正在为每个服务、每个控制器和每个存储库编写单元测试。
标签: java unit-testing mocking mapping mapstruct