我如何对servlet进行单元测试?

Ami*_*hum 4 java junit jsp unit-testing servlets

我有一个叫做的servlet Calculator.它读取参数left,rightop通过result在响应中设置属性来返回.

单元测试的最简单方法是什么:基本上我想创建一个HttpServletRequest,设置参数,然后检查响应 - 但我该怎么做?

这是servlet代码(它的目的很小而且很愚蠢):

public class Calculator extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
public Calculator() {
    super();
}       
protected void doGet(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException {
}   
protected void doPost(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException {
    Integer left = Integer.valueOf(request.getParameter("left"));
    Integer right = Integer.valueOf(request.getParameter("right"));
    Integer result = 0;
    String op = request.getParameter("operator");
    if ("add".equals(op)) result = this.opAdd(left, right);
    if ("subtract".equals(op)) result = this.opSub(left, right);
    if ("multiply".equals(op)) result = this.opMul(left, right);
    if ("power".equals(op)) result = this.opPow(left, right);
    if ("divide".equals(op)) result = this.opDiv(left, right);
    if ("modulo".equals(op)) result = this.opMod(left, right);

    request.setAttribute("result", result); // It'll be available as ${sum}.
    request.getRequestDispatcher("index.jsp").forward(request, response);
    }
}
...
Run Code Online (Sandbox Code Playgroud)

}

eri*_*son 12

通常,程序的重要逻辑被分解为可在各种上下文中使用的其他类,而不是紧密耦合到Servlet引擎.这使servlet本身成为Web和应用程序之间的简单适配器.

这使程序更容易测试,并且更容易在桌面或移动应用程序等其他环境中重用.

  • 您仍然需要能够测试"Web和您的应用程序之间的简单适配器". (7认同)
  • 这将属于集成测试类别,而不是单元测试.您将测试servet与特定服务器引擎等的集成,而不是将其作为一个单元进行测试. (2认同)

小智 10

你可以使用几个库.您在应用程序中使用Spring http://www.springsource.org/吗?如果是这样,有一个包含MockHttpServletRequest的spring(spring-test)应用程序.例如:

@Test
public void shouldReturnAValidaRedirectionMessage() {
    MockHttpServletRequest request = new MockHttpServletRequest();
    request.addParameter("op", "addition");
    request.addParameter("left", "1");
    request.addParameter("right", "5");

    CalculatorServlet servlet = new CalculatorServlet();
    Operation operation = servlet.getOperation(request);
    assertNotNull(operation);
    assertEquals(ADDITION, operation.getOperationType());
            ...
Run Code Online (Sandbox Code Playgroud)