Проблема с исключением mocking — Null Pointer при попытке имитировать метод внешнего API

#java #junit #nullpointerexception #mockito

#java #junit #исключение nullpointerexception #mockito

Вопрос:

Я пытаюсь протестировать класс:

 public class WeatherProvider {

private OWM owm;

public WeatherProvider(OWM owm) {
    this.owm = owm;
}

public CurrentWeatherData getCurrentWeather(int cityId) throws APIException, UnknownHostException {

    CurrentWeatherData currentWeather = new CurrentWeatherData(owm.currentWeatherByCityId(cityId));

    return currentWeather;

}

public HourlyWeatherForecastData getHourlyWeather(int cityId) throws APIException, UnknownHostException {

    HourlyWeatherForecastData hourlyWeather = new HourlyWeatherForecastData(owm.hourlyWeatherForecastByCityId(cityId));

    return hourlyWeather;

}
  

}

OWM — это внешний API, поэтому я хочу его издеваться. Я написал тестовый метод:

     @Test
void shouldReturnCurrentWeather() throws APIException, UnknownHostException {
    //given
    OWM owm = mock(OWM.class);
    WeatherProvider weatherProvider = new WeatherProvider(owm);
    int cityId = 123;
    CurrentWeather currentWeather = WeatherDataStub.getCurrentWeather();
    given(owm.currentWeatherByCityId(cityId)).willReturn(currentWeather);

    //when
    CurrentWeatherData currentWeatherData = weatherProvider.getCurrentWeather(cityId);

    //then

}
  

Я получаю java.lang.Исключение NullPointerException в строке given().willReturn(), и я не знаю почему. Я хочу протестировать случаи, когда owm.currentWeatherByCityId(CityId) успешно возвращает объект currentWeather (который в данном случае является классом-заглушкой) или генерирует исключения.
Можете ли вы объяснить мне, что я делаю не так?

Комментарии:

1. Когда вы ставите точку останова в проблемной строке и запускаете тест в debug, какая переменная null ? owm , currentWeather (но это не должно быть проблемой) или, возможно, выражение given(owm.currentWeatherByCityId(cityId)) ?

2. currentWeather не равен null . owm — это «Макет для OWM, hashCode …», Но каждое поле объекта равно нулю (например, apiKey, language, baseUrl и так далее). Когда я добавил выражение given() в список наблюдения, он сказал: «Метод выдал NullPointerException». Я не знаю, как это интерпретировать.

3. Я думаю, что это выражение given(), которое равно нулю.

4. Тогда похоже на какую-то неправильную конфигурацию Mockito. Есть ли у вас @RunWith(MockitoJUnitRunner.class) тестовый класс?

5. Если вы поместите mockito any() anyInt() или eq(cityId) вместо cityId в проблемную строку, решит ли это проблему NPE?