单元测试期间 POJO 对象上的 NullPointer
NullPointer on POJO object during Unit Test
我想测试我的控制器,但我很难使用模拟对象。我有这样的非常简单的方法。
@RequestMapping(value = "/places", method = RequestMethod.GET)
public String showPlacesByQuery(Model model, @RequestParam(value = "q", required = false) String query) {
Location location = geolocationParser.getCoords(query); //this line cause NPE
List placesList = placeService.findPublicPlaces(location, 0);
model.addAttribute("query", query);
model.addAttribute("placesList", placesList);
return "places/list";
}
我写了测试,我得到了 NullPointerException
。我认为原因是geolocationParser.getCoordS(query)
returns null
?或者整个作业有问题 Location location = geolocationParser.getCoords(query);
@Mock
GeolocationParser geolocationParser;
@Mock
PlaceService placeService;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
}
@Test
public void testShowPlacesByQuery() throws Exception {
String query = "SomeQuery";
PlaceController placeController = new PlaceController();
Location location = mock(Location.class);
location.setCity("someString");
location.setLatitude("54.2323");
location.setLongitude("18.2323");
when(geolocationParser.getCoords(Mockito.anyString())).thenReturn(location);
List<Place> expectedPlaces = asList(new Place(), new Place());
when(placeService.findPublicPlaces(location, 0)).thenReturn(expectedPlaces);
MockMvc mockMvc = MockMvcBuilders.standaloneSetup(placeController).build();
mockMvc.perform(get("/places").param("q", query))
.andDo(print())
.andExpect(status().isOk())
.andExpect(view().name("places/list"));
}
我花了几个小时以不同的方式让它发挥作用,但没有结果。
我认为问题在于您没有正确地将模拟传递给被测系统。如果您正在自动装配,则需要启动一个应用程序上下文,否则它无法注入 class。
如果您正在测试 PlaceController
class,则不应手动为 class 创建实例。使用 @InjectMocks
。
@Mock
private FormServiceImpl formService;
@Mock
private FormDao formDao;
@InjectMocks
private PlaceController placeController;
并从这里删除它
@Test
public void testShowPlacesByQuery() throws Exception {
String query = "SomeQuery";
//PlaceController placeController = new PlaceController();
我想测试我的控制器,但我很难使用模拟对象。我有这样的非常简单的方法。
@RequestMapping(value = "/places", method = RequestMethod.GET)
public String showPlacesByQuery(Model model, @RequestParam(value = "q", required = false) String query) {
Location location = geolocationParser.getCoords(query); //this line cause NPE
List placesList = placeService.findPublicPlaces(location, 0);
model.addAttribute("query", query);
model.addAttribute("placesList", placesList);
return "places/list";
}
我写了测试,我得到了 NullPointerException
。我认为原因是geolocationParser.getCoordS(query)
returns null
?或者整个作业有问题 Location location = geolocationParser.getCoords(query);
@Mock
GeolocationParser geolocationParser;
@Mock
PlaceService placeService;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
}
@Test
public void testShowPlacesByQuery() throws Exception {
String query = "SomeQuery";
PlaceController placeController = new PlaceController();
Location location = mock(Location.class);
location.setCity("someString");
location.setLatitude("54.2323");
location.setLongitude("18.2323");
when(geolocationParser.getCoords(Mockito.anyString())).thenReturn(location);
List<Place> expectedPlaces = asList(new Place(), new Place());
when(placeService.findPublicPlaces(location, 0)).thenReturn(expectedPlaces);
MockMvc mockMvc = MockMvcBuilders.standaloneSetup(placeController).build();
mockMvc.perform(get("/places").param("q", query))
.andDo(print())
.andExpect(status().isOk())
.andExpect(view().name("places/list"));
}
我花了几个小时以不同的方式让它发挥作用,但没有结果。
我认为问题在于您没有正确地将模拟传递给被测系统。如果您正在自动装配,则需要启动一个应用程序上下文,否则它无法注入 class。
如果您正在测试 PlaceController
class,则不应手动为 class 创建实例。使用 @InjectMocks
。
@Mock
private FormServiceImpl formService;
@Mock
private FormDao formDao;
@InjectMocks
private PlaceController placeController;
并从这里删除它
@Test
public void testShowPlacesByQuery() throws Exception {
String query = "SomeQuery";
//PlaceController placeController = new PlaceController();