java - 如何使用 ModelMapper 调用测试服务方法
问题描述
我正在为我的服务类编写一些单元测试,特别是一个更新方法,它使用来自请求的给定数据更新实体。
问题是,我正在使用 ModelMapper 将请求数据映射到实体,并且当测试通过映射语句时,它实际上并没有调用 modelMapper 而是 mock .... 它什么都不做,因为它是一个 mock。
我应该如何嘲笑它的行为?
public EntityNode updateEntity(String code, EntityDTO request) {
String message = "Entity with code: %s not found";
EntityNode entity = repository.findByCode(code)
.orElseThrow(() -> new EntityNotFoundException(String.format(message, code)));
modelMapper.map(request, entity);
return repository.save(entity);
}
我曾考虑过使用 ArgumentCaptor,但我不确定它是否适合我的需求,或者它是否真的是我需要做的事情。
这是我未完成的测试方法。在写完所有这些之后,我认为我应该以某种方式存根 ModelMappers.map(),并在调用 repository.save(entity) 时返回调用 ModelMapper 存根 map() 方法的结果。
@Test
void givenValidEntity_whenUpdateEntity_shouldUpdateProperties() {
//given
String code = "TEST";
Entity expected = new Entity();
expected.setName("Old");
EntityDTO request = new EntityDTO();
request.setName("New")
given(repository.findByCode(code)).willReturn(expected);
//when
Entity updatedEntity = service.updateEntity(code, request);
//then
assertEquals(request.getName(), updatedEntity.getName());
}
这有道理吗?
谢谢
解决方案
有什么变化?
通过查看当前代码,似乎modelMapper
发生了变化。这意味着更改单元测试应该在modelMapper
自己的单元测试中。
做什么的EntityNode updateEntity(String code, EntityDTO request)
?
它从存储库中获取实体,获取您的实体,将其传递modelMapper
并通过存储库保存结果。所以在测试这个函数时,你应该只测试那些事情是否发生在正确的参数上,而不是modelMapper
它本身的作用。
如果您想测试您的功能 +modelMapper
那么这更多的是集成测试而不是单元测试。
补充说明
理想情况下,modelMapper 不会改变任何东西。相反,它将采用两个参数并将结果作为新对象返回。这样它会更容易测试和模拟(你可以避免在测试updateEntity
函数时使用参数验证)。
推荐阅读
- python - 使用 Python 查找字符的位置以及在文本中使用的次数
- python - 如何在此代码中理解卷积神经网络的输入图像
- python - OSM 在 Python 中生成具有空间约束的路线
- python - python中的约束线性优化问题
- javascript - 在客户端使用 NodeJs 播放音频文件
- azure-devops - 使用键值对和变量说明符在 yaml 中为 azure devops 管道定义变量
- android - 使用 MediaStore 在 Android Q 中创建/复制文件
- .net-core - 重置 Azure Pipeline 代理使用的 .NET Core SDK 版本
- postgresql - 如何有效地阻止 postgresql 中的序列
- c++ - 是否可以将图像列表保存到文件中?