исключение нулевого указателя при использовании mockito - PullRequest
0 голосов
/ 31 марта 2019

Я совершенно новичок в Mockito и уже потратил пару дней, чтобы написать свое веб-приложение при весенней загрузке. Приложение работает отлично, но я хочу изучать mockito и хочу протестировать некоторые из моих классов, включая контроллер, однако я нахожу эту часть тестирования настолько разочаровывающей, что я почти на грани пропуска этой части тестирования. Поэтому я объясню проблему

Controller.java

       @GetMapping("/checkWeather")
        public String checkWeather(@RequestParam(name="city", required=true, defaultValue="Oops! you typed wrong url!")
                                               String city, Map<String,Object> map, Model model)
                throws IOException,HttpClientErrorException.NotFound {
            try{
                Weather result = getWeatherService.getNewWeatherObject(city);
            map.put("weatherList",crudService.getAllWeatherList());
            }catch (HttpClientErrorException e){
                LOGGER.info("Typed City cannot be found, please type name correctly! Aborting program..");
                return "notfound";
            }
            return "weather-history";
        }

Я хочу протестировать этот контроллер, который зависит от одной службы:

GetWeatherService.java

@Service
public class GetWeatherService {

    @Autowired
    private ReadJsonObjectService readJsonObjectService;

    public Weather getNewWeatherObject(String city) throws IOException {
        String appid = "47c473417a4db382820a8d058f2db194";
        String weatherUrl = "http://api.openweathermap.org/data/2.5/weather?q="+city+"&APPID="+appid+"&units=metric";
        RestTemplate restTemplate = new RestTemplate();
        String restTemplateQuery = restTemplate.getForObject(weatherUrl,String.class);
        Weather weather = readJsonObjectService.setWeatherModel(restTemplateQuery);
        return weather;
    }
}

Теперь, чтобы проверить мой контроллер, я написал этот тест:

WeatherRestControllerTest.java

@AutoConfigureMockMvc
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class WeatherRestControllerTest extends AbstractTestNGSpringContextTests {

private Weather weather;

@Autowired
private MockMvc mockMVC;

@InjectMocks
private WeatherRestController weatherRestController;

@Before
public void setUp() {
    MockitoAnnotations.initMocks(this);

}

@Test
public void testCheckWeather() throws Exception {
    GetWeatherService getWeatherService = Mockito.mock(GetWeatherService.class);
    Mockito.when(getWeatherService.getNewWeatherObject("Munich")).thenReturn(new Weather());
    mockMVC.perform(MockMvcRequestBuilders.get("/checkWeather?city=Munich")).
    andExpect(MockMvcResultMatchers.status().isOk()).
    andExpect(MockMvcResultMatchers.content().string("weather-history"));
    }
}

Но в конце выполнения теста я получаю следующее исключение:

java.lang.NullPointerException
    at com.weatherapi.test.weather_api.rest.WeatherRestControllerTest.getWeatherRest(WeatherRestControllerTest.java:42)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:74)
    at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:84)

Я получаю исключение NullPointerException и не знаю, что происходит не так. Почему его бросать ноль. С утра пытаюсь понять синтаксис, но ничего не получаю. Я потратил пару времени на изучение и изменение синтаксиса, но получил ту же ошибку. Почему это так сложно, и я до сих пор не понимаю, какова цель всего этого.

EDIT:

У меня теперь есть новая реализация для WeatherRestcontrollerTest.java выше. Это я сделал согласно входам в комментариях.

1 Ответ

2 голосов
/ 31 марта 2019

Убедитесь, что mockMvc введен правильно.

Добавьте @AutoConfigureMockMvc в ваш тест, чтобы объявление вашего класса теста выглядело как:

@AutoConfigureMockMvc
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class WeatherRestControllerTest extends AbstractTestNGSpringContextTests

Также убедитесь, что mockMvc имеет @ Autowired

@Autowired
private MockMvc mockMVC;

Таким образом mockMvc вводится.

...