我已经对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
}
}
如何让这项工作?
答案 0 :(得分:9)
您希望以不同方式进行测试。您需要验证您的输入会导致预期的输出。对于非模拟结果,您将断言行为。由于您希望验证您的输出设置正确。
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()
验证该行为(以验证条件何时控制它被调用/设置与否)。
答案 1 :(得分:6)
你正在嘲笑HttpServletResponse。因此,由于它是一个模拟,getStatus()
只会返回一个非零值,直到你告诉模拟在调用getStatus()
时返回其他内容。它不会返回传递给setStatus()
的值,因为它是一个模拟器,没有做任何事情。
你可以使用更智能的"模拟HttpServletResponse,就像那个provided by Spring。