[英]How do I Unit Test a servlet?
我有一個名為Calculator
的servlet。 它通過在響應中設置屬性result
來讀取left
, right
和op
的參數並返回。
單元測試的最簡單方法是什么:基本上我想創建一個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的一部分。
不能說這是最好的方法:但要單元測試一個這樣的簡單servlet(一個不使用轉發,上下文等......)你可以簡單地做的是:
op=add
用於加法單元測試。 如果您使用自定義類,則只需在內部屬性對象中設置它們即可。 如果您正在使用模擬,那么設置期望就可以了。 new Calculator()
,將所需的lib保留在類路徑中。 現在調用此實例上的service
方法。 對於嘲弄,一個簡單的起點是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.