Mockito:参数的模拟服务抛出空指针异常

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mockito:参数的模拟服务抛出空指针异常相关的知识,希望对你有一定的参考价值。

有这个控制器方法来测试

@RequestMapping("/search/{q}")
public String getWeatherForSearchTerm(@PathVariable String q, Model model) {
    GeocodingResult geocodingResult = geocodingService.findBySearchTerm(q);
    Weather weather = weatherService.findByLocation(geocodingResult.getGeometry().getLocation());
    model.addAttribute("geocodingResult",geocodingResult);
    model.addAttribute("weather",weather);
    return "weather/detail";
}

试图运行此测试

@Test
public void getWeatherForSearchTermTest() throws Exception{
    GeocodingResult geocodingResult = new GeocodingResult();

    Weather weather = new Weather();

    Mockito.when(geocodingService.findBySearchTerm("13")).thenReturn(geocodingResult);

    Mockito.when(weatherService.findByLocation(any(Location.class))).thenReturn(weather);
    mockMvc.perform(get("/search/13"))
            .andExpect(MockMvcResultMatchers.view()
            .name("weather/detail"));
    Mockito.verify(geocodingService).findBySearchTerm(any(String.class));
}

我在尝试在Controller中执行此代码行时收到NullPointerException

Weather weather = weatherService.findByLocation(geocodingResult.getGeometry().getLocation());

即使

        Mockito.when(weatherService.findByLocation(any(Location.class))).thenReturn(weather);

被定义为。

调试后我意识到这是抛出异常的部分。

    geocodingResult.getGeometry().getLocation()

我不明白为什么如果我在代码片段代码上模拟了如上所示的响应,就会发生这种情况。

我的班级注释了

@RunWith(MockitoJUnitRunner.class)

并定义了成员类:

 private MockMvc mockMvc;

@InjectMocks
private WeatherController controller;

@Mock
private WeatherService weatherService;

@Mock
private GeocodingService geocodingService;
答案

嘲笑没有错。问题是,你正在返回一个GeocodingResult的浅物。 GeocodingResult的基础属性(如geometry)未明确设置,因此它们必须已初始化为null。

你需要做点什么

@Test
public void getWeatherForSearchTermTest() throws Exception {
    Geometry geometry = new Geometry();
    // Assuming location is string
    geometry.setLocation("Mars");

    GeocodingResult geocodingResult = new GeocodingResult();
    geocodingResult.setGeometry(geometry);
    // remaining code here
}

以上是关于Mockito:参数的模拟服务抛出空指针异常的主要内容,如果未能解决你的问题,请参考以下文章

称为验证的 Mockito Kotlin 单元测试方法抛出空指针异常

赋值操作期间未抛出空指针异常

Android Canvas drawcolor 抛出空指针异常

Play 2.4 Finder 抛出空指针异常

sbt 命令抛出空指针异常

HttpServletResponse getWriter() 写函数几天后开始抛出空指针异常?