Mockito servlet测试:无法使用响应 - 它没有提交

Wil*_*Dev 6 java testing servlets mockito

我已经对servlet进行了基本测试,以测试它的响应状态代码,但它不起作用 - 它总是为0,尽管我已经将servlet中的响应状态代码设置为200.

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
  }
}
Run Code Online (Sandbox Code Playgroud)

怎么让这个工作?

pic*_*ypg 11

你想以不同的方式测试它.您需要验证输入是否导致预期输出.对于非模拟结果,您将断言该行为.因为您要验证输出是否设置正确.

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);
    }
 }
Run Code Online (Sandbox Code Playgroud)

如果您希望在给定某些输入的情况下不接触某些内容,那么您应该考虑使用verify(response, never()).shouldNotBeCalledButSometimesIs()(以验证条件何时控制它被调用/设置与否)来验证该行为.


JB *_*zet 8

你在嘲笑HttpServletResponse.所以,因为它是一个模拟器,getStatus()只会返回一个非零值,直到你告诉mock在getStatus()调用时返回其他东西.它不会返回传递给的值setStatus(),因为它是一个模拟器,不会做任何事情.

您可以使用"更智能"的模拟HttpServletResponse,就像Spring提供的那样.