簡體   English   中英

我如何對servlet進行單元測試?

[英]How do I Unit Test a servlet?

我有一個名為Calculator的servlet。 它通過在響應中設置屬性result來讀取leftrightop的參數並返回。

單元測試的最簡單方法是什么:基本上我想創建一個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);
    }
}
...

}

通常,程序的重要邏輯被分解為可在各種上下文中使用的其他類,而不是緊密耦合到Servlet引擎。 這使servlet本身成為Web和應用程序之間的簡單適配器。

這使程序更容易測試,並且更容易在桌面或移動應用程序等其他環境中重用。

你可以使用幾個庫。 您在應用程序中使用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());
            ...

查看ServletUnit。 它是HttpUnit的一部分。

http://httpunit.sourceforge.net/doc/servletunit-intro.html

不能說這是最好的方法:但要單元測試一個這樣的簡單servlet(一個不使用轉發,上下文等......)你可以簡單地做的是:

  1. 使用任何模擬庫創建模擬HttpServletReqeust和HttpServletResponse實例。 更簡單的是使用RequestWrapper和ResponseWrapper類(通過擴展HttpServletReqeust和HttpServletResponse類實現的簡單自定義類)。
  2. 在這些模擬(或自定義)實例上設置某些屬性 - 在每個測試用例中要測試的參數 - 例如op=add用於加法單元測試。 如果您使用自定義類,則只需在內部屬性對象中設置它們即可。 如果您正在使用模擬,那么設置期望就可以了。
  3. 創建servlet的實例 - new Calculator() ,將所需的lib保留在類路徑中。 現在調用此實例上的service方法。
  4. 當調用返回時,從響應類中獲取o / p並斷言它。 由於響應類同樣是自定義類或模擬版本,因此這應該很容易。

對於嘲弄,一個簡單的起點是EasyMock或Mockito(我的收藏)

包裝器的一個示例: http//tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/http/HttpServletRequestWrapper.html

HTH

通常,您應該從Servlet容器詳細信息中抽象出業務邏輯。 你可以使用Spring測試包來模擬ServletRequest,但是模擬Servlet容器是個壞主意。 因此,您應該在真實容器上運行系統測試,或者將您的邏輯從servlet移動到單獨的bean中並單獨測試它。

  public class Calculator {
    public Integer calculate(Integer left, Integer right, String op) {
      Integer result = 0;
      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);
      return result;
    }
  }


  public class CalculatorServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
        throws ServletException, IOException {
     Integer left = Integer.valueOf(request.getParameter("left"));
     Integer right = Integer.valueOf(request.getParameter("right"));
     String op = request.getParameter("operator");
     Integer result = calculator.calculate(left, right, op);
     request.setAttribute("result", result); // It'll be available as ${sum}.
     request.getRequestDispatcher("index.jsp").forward(request, response);
   }
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM