当前位置: 首页 > 知识库问答 >
问题:

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

贝财
2023-03-14

我正在尝试使用MockMvc和mockito为应用程序中的rest控制器类编写单元测试。我有一个实体类的DTO类,我给出它作为controller方法的输入。controller方法将此DTO对象映射到entity类中,并使用my service类持久化它。持久化之后,通过映射service类的方法返回的对象来创建一个新的DTO类,并在ResponseEntity对象中返回这个DTO。在我的单元测试中,我已经使用@MockBean注释模拟了service类和ModelMapper类。我还在为模拟类的方法设置预期的返回值。但是当我运行测试时,我看到响应体是空的,我假设这是因为模拟映射器没有正确返回DTO对象。有人能帮我让模拟映射器正确地返回对象,这样我的测试就通过了吗?多谢了。

@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"));
    }

共有1个答案

谢典
2023-03-14

经过大量的挖掘,我认为这条线

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);
 类似资料:
  • 使用MapStruct,我创建了一个映射器,它是一个抽象类。我决定将映射器从接口转换为抽象,以便使用组件名称,该组件本身使用名为的组件。 尽管映射工作正常,但在单元测试中,它会抱怨组件找不到合格bean。 映射器类。我尝试在注释的属性中添加。但是异常移到了的下一个组件。 出现异常的测试类。正如我提到的,我尝试将添加到。我还尝试通过添加来完全模仿它。

  • 遇到了另一个常见的问题,同时为Spring Batch编写单元测试和集成测试组件是如何模拟域对象。一个很好的例子是StepExecutionListener,如下所示: public class NoWorkFoundStepExecutionListener extends StepExecutionListenerSupport { public ExitStatus afterSte

  • 我在尝试包装我的代码以用于单元测试时遇到了一些问题。问题是。我有接口IHttpHandler: 现在很明显,我将在Connection类中有一些方法,这些方法将从my后端检索数据(JSON)。但是,我想为这个类编写单元测试,显然我不想编写针对真实后端的测试,而是一个被嘲弄的测试。我曾尝试谷歌一个很好的答案,但没有很大的成功。我以前可以并且曾经使用过Moq来模拟,但是从来没有在像HttpClient

  • 我试图使用MapStruct在dto和实体对象之间映射convert,但是生成的映射器实现只返回空的映射对象。 BeermapperImpl 任何人都可以提供我的代码可能出错的地方?谢谢!

  • 使用@SpringBootTest,据我所知,Spring实际上是在启动应用程序,并且应该创建映射器类,所以我不明白,为什么映射器总是空?!当我删除@SpringBootTest中的DummyMapper.class时,会出现一个错误,上面写着“Failed to load application Context”。这向我表明,映射器是被识别的。 我觉得奇怪的另一件事是,我必须在映射器中使用“un

  • 我还尝试将模拟转换为文档,如下所示 但这会在代码实现内部访问MongoCollection时产生NullpointerException异常。 这两个我都试过了 null 我厌倦了用java编写相同的测试,并在其中进行泛型的转换。 有人在Kotlin有嘲弄泛型类的经验吗?