модель маппер макет возвращает нулевой объект в тесте весенней загрузки модуля - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь написать модульные тесты для класса контроллера отдыха в моем приложении, используя Mock Mvc и Mockito. У меня есть класс DTO для моего класса сущности, который я даю в качестве входных данных для метода контроллера. Метод контроллера отображает этот объект DTO в класс сущности и сохраняет его, используя мой класс обслуживания. После сохранения новый класс DTO создается путем сопоставления объекта, возвращаемого методом класса обслуживания, и этот DTO возвращается в объекте ResponseEntity. В моем модульном тесте я смоделировал класс обслуживания и класс ModelMapper с помощью аннотации @MockBean. Я также устанавливаю ожидаемые возвращаемые значения для методов проверяемого класса. Но когда я запускаю тест, я вижу, что тело ответа пустое, что, как я полагаю, связано с тем, что имитатор не возвращает объект 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 Ответ

0 голосов
/ 30 апреля 2020

После долгих раскопок я понял, что строка

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

неправильно устанавливает макет объекта. Я изменил эту строку, чтобы использовать any() в методе when(), и после этого он работал нормально. Вот обновленный код:

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