我编写了一个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)