2017-03-17 24 views
1

嗨我是junit的初學者,我偶然發現了在我的servlet中定義的init()方法的junit。如何編寫init()的junit?

這是我的servlet。

public class EmailSendingServlet extends HttpServlet{ 

     private static final long serialVersionUID = -7796409155466523414L; 

     /** 
     * Creates an Email Model Object 
     */ 
     Email emailMessage = new Email(); 

     /** 
     * Overrides the init constructor of servlet 
     * 
     */ 
     public void init() { 
      ServletContext context = getServletContext(); 
      emailMessage.setHostName(context.getInitParameter("host")); 
      emailMessage.setPortName(context.getInitParameter("port")); 
     } 
     /** 
     * Overrides the Service method of Generic Servlet 
     */ 
     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 


      emailMessage.setFrom(request.getParameter("from")); 
      emailMessage.setRecipient(request.getParameterValues("recipients")); 
      emailMessage.setSubject(request.getParameter("subject")); 
      emailMessage.setBody(request.getParameter("body")); 
      emailMessage.setFile(request.getParameterValues("file")); 

      String resultMessage = ""; 

      try { 
       EmailUtility.sendEmail(emailMessage); 
       resultMessage = "The Email was sent successfully"; 
       request.setAttribute("message", resultMessage); 
       response.setContentType("text/html"); 
       RequestDispatcher view = request.getRequestDispatcher("/Result.jsp"); 
       view.forward(request, response); 

      } catch (Exception e) { 

       e.printStackTrace(); 
      } 
     } 

和下面給出的是我的servlet類的測試用例:

@RunWith(PowerMockRunner.class) 

    public class EmailSendingServletTest extends Mockito 
    { 

     @Test 
     public void TestEmailSendingServlet() { 

      HttpServletRequest request = mock(HttpServletRequest.class); 
      HttpServletResponse response = mock(HttpServletResponse.class); 
      RequestDispatcher requestDispatcher = mock(RequestDispatcher.class); 

      when(request.getParameter("from")).thenReturn("[email protected]"); 
      String[] recipients = new String [3]; 
      recipients[0] = "[email protected]"; 
      recipients[1] = "[email protected]"; 
      recipients[2] = "[email protected]"; 
      when(request.getParameterValues("recipients")).thenReturn(recipients); 
      when(request.getParameter("subject")).thenReturn("Test Mail"); 
      when(request.getParameter("body")).thenReturn("This is Body"); 
      String[] files = new String[1]; 
      files[0] = "C:\\Users\\asara3\\Documents\\Architecture.jpg"; 
      when(request.getParameterValues("file")).thenReturn(files); 
      when(request.getRequestDispatcher("/Result.jsp")).thenReturn(requestDispatcher); 

      try { 
       new EmailSendingServlet().doPost(request, response); 
      } catch (ServletException e) { 

       e.printStackTrace(); 
      } catch (IOException e) { 

       e.printStackTrace(); 
      } 


     } 

我有點糊塗了存根的context.getInitParameter(「主機」)在我的測試案例?任何幫助傢伙?

+0

注意:不要在您的測試用例中捕獲異常。如果引發異常,此測試將通過。向測試方法簽名添加'throws'。 –

+1

不應該有任何init()方法。 emailMessage變量應該是doPost()的局部變量。請記住,同一個唯一的servlet實例同時處理對該servlet的所有請求。您不希望兩個請求寫入同一個EmailMessage對象。 –

+0

@AndyTurner感謝您的建議。將照顧這一點。 – user3476378

回答

2

您可以使用Mockito的spy()方法來模擬getServletContext()方法的行爲。

例如,在您的setup()方法或在單元測試類的構造函數補充一點:

public class EmailSendingServletTest { 
    ... 
    private EmailSendingServlet emailSendingServlet; 
    private EmailSendingServlet emailSendingServletSpy; 
    ... 

    public EmailSendingServletTest(){ 
    emailSendingServlet = new EmailSendingServlet(); 
    emailSendingServletSpy = Mockito.spy(emailSendingServlet); 
    } 
} 

然後你可以嘲笑的getServletContext()方法類似:

Mockito.doReturn(yourMockedServletContext).when(emailSendingServletSpy.getServletContext()); 

一般我避免了間諜(嘲笑被測試的對象),但是在第三方依賴的情況下,作爲servlet,這是一個可以接受的情況,因爲重構是不可能的,否則它迫使我們不以第三方的方式編寫標準變更depende使用ncy。這通常也是不希望的。

+0

嗨大衛,謝謝你的建議。我究竟需要什麼來偵察?這是什麼郵件服務?我感到困惑。 – user3476378

+0

你好,歡迎你。抱歉錯字。我更新了。你必須窺探'emailSendingServlet',被解釋的對象:) – davidxxx

+0

所以我試過了。它不工作。當我試圖模擬getServletContext()時拋出未完成的存根異常: private EmailSendingServlet servlet; \t \t @Test \t公共無效TestEmailSendingServlet(){ \t \t的servlet =新EmailSendingServlet(); \t \t servlet = Mockito.spy(servlet); \t \t ServletContext context = mock(ServletContext.class); \t \t Mockito.doReturn(context).when(servlet.getServletContext()); \t \t when(context.getInitParameter(「host」))。thenReturn(「localhost」); \t \t when(context.getInitParameter(「port」))。thenReturn(「25」); – user3476378