#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?