2015-05-08 41 views
3

我已經做了一個基本的測試,以測試它的響應狀態碼,但它不起作用 - 它總是0,儘管我已經設置了響應狀態碼裏面的servlet爲200.Mockito servlet測試:不能使用響應 - 它沒有提交

public class TestMyServlet extends Mockito { 

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

    when(request.getParameter("test")).thenReturn("1"); 

    new MyServlet().doPost(request, response); 

    System.out.println(response.isCommited()); // false 
    System.out.println(response.getContentType()); // null 
    System.out.println(response.getStatus()); // 0 
    } 
} 

如何讓這個工作?

回答

5

你在嘲笑HttpServletResponse。所以,因爲這是一個模擬,所以getStatus()只會返回一個非零值,直到您告訴模擬在調用getStatus()時返回其他值。它不會返回傳遞給setStatus()的值,因爲這是一個模擬,它不會執行任何操作。

你可以使用一個「更聰明」的模擬HttpServletResponse,就像一個provided by Spring

6

你想以不同的方式測試。您需要驗證您的輸入導致預期的輸出。對於非模擬結果,您會聲明的行爲。既然你想驗證你的輸出設置正確。

import static org.mockito.Mockito.mock; 
import static org.mockito.Mockito.verify; 

public class MyServletTests { 
    @Test 
    public void testValidRequest() throws Exception { 
     HttpServletRequest request = mock(HttpServletRequest.class); 
     HttpServletResponse response = mock(HttpServletResponse.class); 

     when(request.getParameter("test")).thenReturn("1"); 

     new MyServlet().doPost(request, response); 

     // ensure that the request was used as expected 
     verify(request).getParameter("test"); 

     // ensure that the response was setup as expected based on the 
     // mocked inputs 
     verify(response).setContentType("text/html"); 
     verify(response).setStatus(200); 
    } 
} 

如果你希望給予一定的投入,不能碰的東西,那麼你應該考慮使用驗證verify(response, never()).shouldNotBeCalledButSometimesIs()(驗證時,條件控制它被稱爲/套與不)這種行爲。