2016-06-01 3 views
0

모두! 테스트 서블릿에 문제가 있습니다 서블릿의이 줄에서 내 테스트, 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()에 초기화 여기

+0

하기 전에 테스트에 추가 보십시오 : 그래서 NullPointerException을 제거 할 수는 doPost

업데이트를 실행하기 전에 init()를 호출해야 이 doReturn (true) .when (spy) .isUserExists ("kote", "Qw12")에 의해 조롱되지 않는 이유는 .getParameter (LOGIN), request.getParameter (PASSWORD) –

답변

0

귀하의 문제가 IUserDao dao;에 코드를 입력 여기에 코드를 입력합니다.나는이 줄 경우 (dao.isUserExists (요청에 문제가 servlet.doPost(request, response);

ServletContext sc = servlet.getServletContext(); 
ServletContext scSpy = spy(sc); 
// return dao from servlet context 
doReturn(spy).when(scSpy).getAttribute("Users"); 
servlet.init(); 
+0

답변 해 주셔서 감사합니다.하지만 servlets.LoginServlet.init (LoginServlet.java:23) –

+0

에 새 NPE 이 있습니다.이 라인에서 새 NPE가 있습니다. servlets.LoginServlet.init (LoginServlet.java:23) dao = (IUserDao) getServletContext(). getAttribute ("Users"); –

+0

답변이 업데이트되었습니다. 아마도 도움이 될 것입니다. – Solorad

관련 문제