我正在使用mockito来测试servlet
我的servlet的doGet方法是
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("application/json");
PrintWriter out = response.getWriter();
String servletPath = request.getServletPath();
String servletInfo = request.getPathInfo();
List<SchoolProperties> itemList = itemService.findAll();
ItemParser itemParser = new ItemParser();
itemParser.setJsonFactory(new JsonFactory());
out.println(itemParser.parseItem(itemList));
}
我的测试方法是
@Test
public void shouldPrintJsonString throws IOException, ServletException{
HttpServletRequest req = mock(HttpServletRequest.class);
HttpServletResponse res = mock(HttpServletResponse.class);
ItemService is = mock(ItemService.class);
ArrayList mockList = mock(ArrayList.class);
SchoolProperties s1 = new SchoolProperties(1, "MyItemName", 5);
SchoolProperties s2 = new SchoolProperties(1, "MyItemName", 5);
mockList.add(s1);
mockList.add(s2);
StringWriter writer = new StringWriter();
when(req.getServletPath()).thenReturn("/school_items");
when(req.getMethod()).thenReturn("GET");
when(req.getPathInfo()).thenReturn("/");
when(is.findAll()).thenReturn(mockList);
given(res.getWriter()).willReturn(new PrintWriter(writer));
ItemController it = new ItemController();
it.setItemService(is);
it.service(req, res);
String expectedResult="";
verify(res).setContentType("application/json");
verify(is.findAll(),atLeast(1));
Assert.assertEquals(expectedResult, writer.toString());
Assert.assertTrue(writer.toString().contains("["));
}
我在运行测试用例时遇到空指针异常。我怀疑我的 ItemParser 和 JsonFactory 没有在测试中创建或没有注入(inject)。它是否正确?如果是这样,如何在不更改 servlet 方法的情况下使其不为 null?
最佳答案
你的问题是你 mock 了 ArrayList
,这意味着它的 add
方法不会执行任何操作,因此 s1
和s2
从未在列表中。不要 mock ArrayList
- 使用真实的ArrayList
相反。
还有verify(is.findAll(),atLeast(1));
应该读 verify(is,atLeast(1)).findAll();
关于java - 使用mockito测试servlet的NullPointer异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22850968/