如何使用JUnit测试在servlet中测试void doGet和doPost方法?

时间:2018-01-24 15:40:03

标签: java servlets junit

我编写了一个servlet类,我想测试这个类中的方法。不幸的是,我在为我的servlet中的doGet和doPost方法编写一个好的JUnit测试时遇到了麻烦。让我难过的是这些方法都是无效的方法。所以没有预期的结果,但他们肯定在做一些事情。

我尝试了几种变体,但没有成功。我在测试时遇到NullPointerException。有人可以帮助我吗?

我的Servlet

@WebServlet(name = "SearchContactServlet", urlPatterns = { "/SCFH", "/searchUser" })
public class SearchContactServlet extends HttpServlet {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public SearchContactServlet() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        if (!SecurityTool.checkLogin(request, response)) {
            return;
        }

        String dispatchUrl = null;
        request.setAttribute("originalURI", request.getRequestURI());
        String action = getActionString(request);

        switch (action) {
        case "SCFH":
            dispatchUrl = "/jsp/searchContact.jsp";
            break;
        default:
            dispatchUrl = "/index.jsp";
            break;

        }
        if (dispatchUrl != null) {
            RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF" + dispatchUrl);
            rd.forward(request, response);
        }
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        SecurityTool.checkLogin(request, response);
        if (!SecurityTool.checkLogin(request, response)) {
            return;
        }

        String dispatchUrl = null;
        request.setAttribute("originalURI", request.getRequestURI());
        String action = getActionString(request);
        String firstName = request.getParameter("firstname");
        String prefix = request.getParameter("prefix");
        String lastName = request.getParameter("lastname");
        String domain = request.getParameter("domain");
        String companyName = request.getParameter("companyname");

        Map<String, String> errors = new HashMap<String, String>();

        if (nullOrEmpty(firstName)) {
            errors.put("firstname", "Oops, something went wrong. Please enter a first name.");
            request.setAttribute("errors", errors);
            request.getRequestDispatcher("/WEB-INF" + "/jsp/searchContact.jsp").forward(request, response);

        } else if (nullOrEmpty(lastName)) {
            errors.put("lastname", "Oops, something went wrong. Please enter a last name.");
            request.setAttribute("errors", errors);
            request.getRequestDispatcher("/WEB-INF" + "/jsp/searchContact.jsp").forward(request, response);

        } else if (nullOrEmpty(domain)) {
            errors.put("domain", "Oops, something went wrong. Please enter a domain.");
            request.setAttribute("errors", errors);
            request.getRequestDispatcher("/WEB-INF" + "/jsp/searchContact.jsp").forward(request, response);

        }

        switch (action) {
        case "searchUser":
            PunchCard punchCard = new PunchCard(firstName, prefix, lastName, domain, companyName);
//          Controller controller = new Controller();
            punchCard = Controller.getMail(punchCard);
            SearchResult[] searchResults = punchCard.getSearchResults();
            System.out.println("number of searchresults:" + punchCard.getSearchResults().length);

            // if (nullOrEmpty(firstName) || nullOrEmpty(lastName) || nullOrEmpty(domain)
            // || nullOrEmpty(companyName)) {
            // // Iets in het scherm printen dat bepaalde velden ingevuld moeten worden
            // Terug naar searchContact.jsp met boodschap "xxx moet worden ingevuld"
            // }


            request.setAttribute("punchCard", punchCard);
            request.setAttribute("searchResults", searchResults);
            dispatchUrl = "/jsp/result.jsp";
            break;

        default:
            dispatchUrl = "index.jsp";
            break;

        }
        if (dispatchUrl != null) {
            RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF" + dispatchUrl);
            rd.forward(request, response);
        }
    }

我的JUnit测试

@Test
    public void testServlet() {
        HttpServletRequest request = mock(HttpServletRequest.class);
        HttpServletResponse response = mock(HttpServletResponse.class);

        when(request.getParameter("firstName")).thenReturn("Piet");
        when(request.getParameter("prefix")).thenReturn("de");
        when(request.getParameter("lastName")).thenReturn("Vries");
        when(request.getParameter("domain")).thenReturn("springprofessional.nl");
        when(request.getParameter("companyName")).thenReturn("Spring");

        StringWriter stringWriter = new StringWriter();
        PrintWriter printWriter = new PrintWriter(stringWriter);
        try {
            when(response.getWriter()).thenReturn(printWriter);
        } catch (IOException e1) {
            e1.printStackTrace();
        }

        try {
            new SearchContactServlet().doPost(request, response);
        } catch (ServletException | IOException e) {
            e.printStackTrace();
        }

        printWriter.flush();
        assertTrue(stringWriter.toString().contains("Piet" + "de" + "Vries" + "springprofessional.nl" + "Spring"));
    }

这是堆栈跟踪:

java.lang.NullPointerException
at nl.springprofessional.it.addressinatorWebApp.security.SecurityTool.checkLogin(SecurityTool.java:49)
at nl.springprofessional.it.addressinatorWebApp.webServlet.SearchContactServlet.doPost(SearchContactServlet.java:68)
at nl.springprofessional.it.addressinatorWebApp.webServlet.SearchContactServletTest.testServlet(SearchContactServletTest.java:41)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:538)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:760)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206)

0 个答案:

没有答案