Тест MockMvc выполнить (post()) завершается с ошибкой NullPointerException

#spring #spring-boot #nullpointerexception #mockito #mockmvc

#spring #spring-boot #исключение nullpointerexception #mockito #mockmvc

Вопрос:

У меня есть следующий контроллер

 @RequestMapping("/locations")
@AllArgsConstructor
@RestController
public class LocationController {

    private final LocationService locationService;

    @PostMapping
    public ResponseEntity<LocationDTO> createLocation(@Valid @RequestBody LocationDTO locationDTO) {

        Location location = locationService.createLocation(toLocation(locationDTO));

        URI uri = ServletUriComponentsBuilder.fromCurrentRequest()
                                             .path("/{id}")
                                             .buildAndExpand(location.getId())
                                             .toUri();

        return ResponseEntity.created(uri).body(toDTO(location));
    }

    //other methods
}
  

и тесты

 @WebMvcTest(LocationController.class)
class LocationControllerTest {

    @Autowired
    private MockMvc mvc;

    @Autowired
    private ObjectMapper objectMapper;

    @MockBean
    private LocationService locationService;

    @MockBean
    private MappingMongoConverter mappingMongoConverter;

    @WithMockUser(value = "test")
    @Test
    void createLocation() throws Exception {

        GeoJsonPoint testGeoJsonPoint = new GeoJsonPoint(123, 123);
        LocationProperties testLocationProperties = new LocationProperties("testName", "testDesc");
        Location testLocation = new Location("testId", testGeoJsonPoint, testLocationProperties);
        String locationDTOString = objectMapper.writeValueAsString(toDTO(testLocation));

        mvc.perform(post("/locations")
                .contentType(APPLICATION_JSON)
                .content(locationDTOString)
                .characterEncoding("utf-8"))
           .andDo(print())
           .andExpect(status().isCreated())
           .andExpect(content().contentType(APPLICATION_JSON))
           .andExpect(content().json(locationDTOString))
           .andExpect(header().string("uri", "http://localhost:8080/api/locations/testId"));
    }
}
  

Результаты теста:
Устранено исключение: Тип = java.lang.Исключение NullPointerException

java.lang.Ошибка утверждения: ожидаемый статус: <201> но было: <500> Ожидаемый:201 Фактический:500

Похоже, Location location = LocationService.createLocation(toLocation(locationDTO)); для этого местоположения установлено значение null. Как мне это исправить? Любая помощь приветствуется.

Ответ №1:

Издевательский LocationService, вероятно, возвращает null (это происходит в моем тесте). Для этого теста LocationService должен быть реальным экземпляром службы определения местоположения, а не макетом.

Ответ №2:

Мне пришлось издеваться над поведением службы, поскольку это макет

when(locationService.createLocation(any())).thenReturn(testLocation);