MockMvc тестовый запрос POST

У меня есть следующий почтовый маршрут в моем контроллере REST:

     @RequestMapping(value = "", method = RequestMethod.POST, produces = 
    "application/json")
    public ResponseEntity saveMovie(@RequestBody Movie movie){
        movieService.saveMovie(movie);
        return new ResponseEntity<Movie>(movie, HttpStatus.OK);
    }

Маршрут использует службу для добавления фильма, переданного в теле запроса, в хранилище данных. Сигнатура метода обслуживания такова:

    Movie saveMovie(Movie movie);

Я написал следующий тест и вспомогательный метод для него:

      @Test
      public void saveMovie() throws Exception {
        Movie movie1 = new Movie();
        movie1.setImdbID("imdb1");
        movie1.setTitle("Meter");
        movie1.setYear("2015");
        movie1.setPoster("meter.jpg");

        when(movieService.saveMovie(movie1)).thenReturn(movie1);
        mockMvc.perform(post("/v1/api/movie")
                .contentType(MediaType.APPLICATION_JSON_UTF8)
                .content(asJsonString(movie1))
                .accept(MediaType.APPLICATION_JSON))
                .andExpect(status().isOk())                   
                .andExpect(content().contentType
                     (MediaType.APPLICATION_JSON_UTF8_VALUE));
                 verify(movieService, times(1)).saveMovie(movie1);
                 verifyNoMoreInteractions(movieService);
    }



    public static String asJsonString(final Object obj) {
        try {
            final ObjectMapper mapper = new ObjectMapper();
            final String jsonContent = mapper.writeValueAsString(obj);
            System.out.println(jsonContent);
            return jsonContent;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

Я получаю следующую ошибку:

    Argument(s) are different! Wanted:
     com.stackroute.ng2boot.service.MovieService#0 bean.saveMovie(
       com.stackroute.ng2boot.domain.Movie@ae372b9
     );
     -> at 

     com.stackroute.ng2boot.controllers.MovieRestControllerTest.
     saveMovie(MovieRestControllerTest.java:129)
     Actual invocation has different arguments:
    com.stackroute.ng2boot.service.MovieService#0 bean.saveMovie(
    com.stackroute.ng2boot.domain.Movie@2098d37d
    );
    -> at     
    com.stackroute.ng2boot.controllers.MovieRestController.
    saveMovie(MovieRestController.java:60)

За исключением сохранения и обновления, где мне нужно передать фильм JSON в качестве тела запроса, другие маршруты проходят тесты. Пожалуйста, поделитесь своим ценным вкладом.

Заранее спасибо.


person user2693135    schedule 28.05.2017    source источник


Ответы (2)


Ты можешь попробовать:

import static org.mockito.Matchers.refEq;
----
verify(movieService, times(1)).saveMovie(refEq(movie1));
person Nhut Nguyen    schedule 27.09.2017

Вам следует попробовать:

verify(movieService).saveMovie(ArgumentMatchers.eq(movie1));

Также было бы хорошо убедиться, что у вас есть методы equals и hashCode, реализованные в классе Movie.

Другая небольшая вещь, которую я заметил (однако не имеющая отношения к вашей проблеме), заключается в том, что вам не нужно использовать одновременно times(1) и verifyNoMoreInteractions(movieService). По умолчанию предполагается, что Mockito.verify будет вызываться один раз. Взгляните на его источник:

public static <T> T verify(T mock) {
    return MOCKITO_CORE.verify(mock, times(1));
}
person mate00    schedule 17.05.2019