java - 使用mockito测试servlet的NullPointer异常

标签 java servlets mockito

我正在使用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方法不会执行任何操作,因此 s1s2从未在列表中。不要 mock ArrayList - 使用真实的ArrayList相反。

还有verify(is.findAll(),atLeast(1));应该读 verify(is,atLeast(1)).findAll();

关于java - 使用mockito测试servlet的NullPointer异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22850968/

相关文章:

java - 我如何获取对象而不是 map 地址?

java - 排除父 POM 中的指令

java - 请求的资源不可用

android - 使用 Mockito 对 RecyclerView 适配器进行单元测试

java - 具有另一个返回 void 的方法的方法的单元测试

java - 使用 EasyMock 或 Mockito 模拟 void 方法的 try catch block 并捕获异常

java - 我如何计算一大堆不同的扫描仪输入?

java - 我如何在 java 中切换红绿灯,因为每个灯应该使用多线程分别只吹 3 秒?

java - 如何以表格格式显示ArrayList?

java - JSP - 在同一表单/同一页面中获取添加结果