首页 > 解决方案 > 如何使用 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());
}

这有道理吗?

谢谢

标签: javaspringspring-bootunit-testingtesting

解决方案


有什么变化?

通过查看当前代码,似乎modelMapper发生了变化。这意味着更改单元测试应该在modelMapper自己的单元测试中。

做什么的EntityNode updateEntity(String code, EntityDTO request)

它从存储库中获取实体,获取您的实体,将其传递modelMapper并通过存储库保存结果。所以在测试这个函数时,你应该只测试那些事情是否发生在正确的参数上,而不是modelMapper它本身的作用。

如果您想测试您的功能 +modelMapper那么这更多的是集成测试而不是单元测试。

补充说明

理想情况下,modelMapper 不会改变任何东西。相反,它将采用两个参数并将结果作为新对象返回。这样它会更容易测试和模拟(你可以避免在测试updateEntity函数时使用参数验证)。


推荐阅读