모두! 테스트 서블릿에 문제가 있습니다 서블릿의이 줄에서 내 테스트, NPE를 새로 고쳤습니다 "session.setAttribute ("login ", user.getLogin());"testNG 및 Mockito로 서블릿을 테스트 할 때 NPE
내 서블릿 :
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
private IUserDao dao;
@Override
public void init() throws ServletException {
dao = (IUserDao) getServletContext().getAttribute("Users");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = request.getSession();
if (dao.isUserExists(request.getParameter(LOGIN), request.getParameter(PASSWORD))) {
User user = dao.getUser(request.getParameter(LOGIN));
session.setAttribute("login", user.getLogin());
session.setAttribute("message", "you logged in successfully!");
response.sendRedirect("hello.jsp");
return;
}
User notUser = new User(request.getParameter(LOGIN), request.getParameter(PASSWORD));
session.setAttribute("user", notUser);
session.setAttribute("wrongUserCredentials", "Wrong login or password");
response.sendRedirect("login.jsp");
}
}
`
내 시험 :
@Test(groups = "positive")
public class TestLoginServlet extends Mockito {
private static final Logger LOGGER = Logger.getRootLogger();
@Mock
private IUserDao dao;
@BeforeClass
public void beforeClass() {
MockitoAnnotations.initMocks(this);
}
@Test
public void testDoPostLoginServlet() throws Exception {
HttpServletRequest request = mock(HttpServletRequest.class);
HttpServletResponse response = mock(HttpServletResponse.class);
HttpSession session = mock(HttpSession.class);
ServletConfig config = mock(ServletConfig.class);
ServletContext context = mock(ServletContext.class);
UserDaoInMemory daoInMemory = new UserDaoInMemory();
UserDaoInMemory spy = spy(daoInMemory);
User user = new User("kote", "Qw12");
when(config.getServletContext()).thenReturn(context);
when(request.getParameter(LOGIN)).thenReturn(user.getLogin());
when(request.getParameter(PASSWORD)).thenReturn(user.getPassword());
when(request.getSession()).thenReturn(session);
when(request.getServletContext()).thenReturn(context);
when(context.getAttribute("Users")).thenReturn(spy);
doReturn(true).when(spy).isUserExists(user.getLogin(), user.getPassword());
LoginServlet servlet = new LoginServlet();
servlet.init(config);
servlet.doPost(request, response);
verify(request, atLeast(1)).getParameter(LOGIN);
verify(request, atLeast(1)).getParameter(PASSWORD);
LOGGER.info("Passed");
}
}
출력 : java.lang.Nul com.epam.denys_leunov.java.lesson9.servlets.TestLoginServlet.testDoPostLoginServlet (TestLoginServlet.java:61)에서 com.epam.denys_leunov.java.lesson9.servlets.LoginServlet.doPost (LoginServlet.java:32) 에서 lPointerException sun.reflect.DelegatingMethodAccessorImpl.invoke에서 sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) 에서 sun.reflect.NativeMethodAccessorImpl.invoke0 (기본 방법) (DelegatingMethodAccessorImpl.java:43) java.lang의에서 에서. reflection.Method.invoke (Method.java:497) at org.testng.internal.MethodInvocationHelper.invokeMethod (MethodInvocationHelper.java:85) at org.testng.internal.Invoker.invokeMethod (Invoker.java:639) at org.testng.internal.Invoker.invokeTestMeth OD org.testng.internal.TestMethodWorker.invokeTestMethods에서 org.testng.internal.Invoker.invokeTestMethods에서 (Invoker.java:816) (Invoker.java:1124) (TestMethodWorker.java:125) org.testng에서 . internal.TestMethodWorker.run (TestMethodWorker.java:108) at org.testng.TestRunner.privateRun (TestRunner.java:774) at org.testng.TestRunner.run (TestRunner.java:624) at org.testng. SuiteRunner.runTest (SuiteRunner.java:359) org.testng.SuiteRunner.runSequentially (SuiteRunner.java:354)에서 org.testng.SuiteRunner.privateRun (SuiteRunner.java:312)에서 org.testng.SuiteRunner에서 . run (SuiteRunner.java:261) at org.testng.SuiteRunnerWorker.runSuite (SuiteRunnerWorker.java:52)(TestNG.java:1116) 에서 을 입력하십시오. org.testng.TestNG.run (TestNG.java:1024) (orgearemoteTestNG.java:74) at org.testng.RemoteTestNGStarter.main (RemoteTestNGStarter.java:121) at sun. java.lang.reflect.Method의에서 sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) 에서 sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) 에서 reflect.NativeMethodAccessorImpl.invoke0 (기본 방법) .invoke (Method.java:497) at com.intellij.rt .execution.application.AppMain.main은 (AppMain.java:144) 는 이 방법 public void init()
에 초기화 여기
하기 전에 테스트에 추가 보십시오 : 그래서 NullPointerException을 제거 할 수는
doPost
업데이트를 실행하기 전에
init()
를 호출해야 이 doReturn (true) .when (spy) .isUserExists ("kote", "Qw12")에 의해 조롱되지 않는 이유는 .getParameter (LOGIN), request.getParameter (PASSWORD) –