java - 模型映射器模拟在 Spring Boot 单元测试中返回空对象

标签 java spring-boot unit-testing mockito

我正在尝试使用 MockMvc 和 Mockito 为我的应用程序中的其余 Controller 类编写单元测试。我的实体类有 DTO 类,我将其作为 Controller 方法的输入。 Controller 方法将此 DTO 对象映射到实体类中,并使用我的服务类将其保留。持久化后,通过映射服务类方法返回的对象来创建一个新的 DTO 类,并且该 DTO 在 ResponseEntity 对象中返回。在我的单元测试中,我使用 @MockBean 注释模拟了服务类和 ModelMapper 类。我还为模拟类的方法设置了预期返回值。但是当我运行测试时,我看到响应正文为空,我认为这是因为模拟映射器没有正确返回 DTO 对象。有人可以帮助我使模拟映射器正确返回对象以便我的测试通过吗?谢谢。

这是 Controller 代码:

@RequestMapping(value = "", method=RequestMethod.POST)
    public ResponseEntity<BranchDto> addBranch(@RequestBody BranchDto branchDto) {
        Branch branch = modelMapper.map(branchDto, Branch.class);
        Branch addedBranch = branchService.addBranch(branch);
        return new ResponseEntity<>(modelMapper.map(addedBranch, BranchDto.class), HttpStatus.CREATED);
    }

这是单元测试代码:

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private BranchService branchService;

    @MockBean
    private ModelMapper mockModelMapper;

    @Test
    public void testAddBranch() throws Exception{
        BranchDto mockBranchDtoToAdd = new BranchDto();
        mockBranchDtoToAdd.setBranchName("TestBranch");
        mockBranchDtoToAdd.setContactNumber("12345");
        mockBranchDtoToAdd.setEmailId("test@abc.com");
        mockBranchDtoToAdd.setCity("TestCity");
        Branch mockBranchToAdd = new Branch();
        mockBranchToAdd.setBranchName("TestBranch");
        mockBranchToAdd.setContactNumber("12345");
        mockBranchToAdd.setEmailId("test@abc.com");
        mockBranchToAdd.setCity("TestCity");

        Branch mockAddedBranch = new Branch();
        mockAddedBranch.setBranchName("TestBranch");
        BranchDto mockAddedBranchDto = new BranchDto();
        mockAddedBranchDto.setBranchName("TestBranch");
        mockAddedBranchDto.setContactNumber("12345");
        mockAddedBranchDto.setEmailId("test@abc.com");
        mockAddedBranchDto.setCity("TestCity");

        Mockito.when(mockModelMapper.map(mockBranchDtoToAdd, Branch.class)).thenReturn(mockBranchToAdd);
        Mockito.when(branchService.addBranch(mockBranchToAdd)).thenReturn(mockAddedBranch);
        Mockito.when(mockModelMapper.map(mockAddedBranch, BranchDto.class)).thenReturn(mockAddedBranchDto);


        ObjectMapper mapper = new ObjectMapper();
        String mockBranchDtoToAddStr = mapper.writeValueAsString(mockBranchDtoToAdd);
        System.out.println(mockBranchDtoToAddStr);
        mockMvc.perform(post("/branches").contentType(MediaType.APPLICATION_JSON).content(mockBranchDtoToAddStr))
        .andExpect(MockMvcResultMatchers.status().isCreated())
        .andExpect(MockMvcResultMatchers.jsonPath("$.branchName").value("TestBranch"));
    }

最佳答案

经过大量挖掘,我发现这条线

Mockito.when(branchService.addBranch(mockBranchToAdd)).thenReturn(mockAddedBranch);

没有正确设置模拟对象。我将此行更改为在 when() 方法中使用 any() ,此后工作正常。这是更新后的代码:

Mockito.when(branchService.addBranch(org.mockito.ArgumentMatchers.any())).thenReturn(mockAddedBranch);
Mockito.when(mockModelMapper.map(org.mockito.ArgumentMatchers.any(), org.mockito.ArgumentMatchers.any())).thenReturn(mockAddedBranch);

关于java - 模型映射器模拟在 Spring Boot 单元测试中返回空对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61504067/

相关文章:

Java AffinetransformOp filter() 搞砸了我的形象

java - 如何为字节码检测设置 Intellij/jar list ?

c# - MSTest取消机制

java - Windows 上 TensorFlow java 的 native 库

java - org.jinterop.dcom.common.JIException : Access is denied. [0x80070005]

java - 该类型的方法 ReplaceVariables(String) 未定义

java - Spring boot - 如何向应用程序上下文提供环境变量以避免单元测试失败

spring-boot - 如何使配置以另一个配置为条件?

java - 如何在 Spring Boot 中创建 Apache POI Excel View 配置

javascript - 如何在不重复父类(super class)测试的情况下在 Mocha 中测试 Backbone 子类?