Как мне модульное тестирование сервлета? - PullRequest
4 голосов
/ 09 ноября 2010

У меня есть сервлет с именем Calculator. Он считывает параметры left, right и op и возвращается, установив атрибут result в ответе.

Какой самый простой способ провести модульное тестирование: в основном я хочу создать HttpServletRequest, установить параметры и затем проверить ответ - но как мне это сделать?

Вот код сервлета (он специально маленький и глупый):

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);
    }
}
...

}

Ответы [ 5 ]

12 голосов
/ 09 ноября 2010

Часто важная логика программы разбивается на другие классы, которые можно использовать в различных контекстах, вместо того, чтобы быть тесно связанным с Servlet Engine. Таким образом, сам сервлет становится простым адаптером между сетью и вашим приложением.

Это облегчает тестирование программы и позволяет повторно использовать ее в других контекстах, таких как настольное или мобильное приложение.

10 голосов
/ 09 ноября 2010

Есть несколько библиотек, которые вы можете использовать. Используете ли вы Spring http://www.springsource.org/ в вашем приложении? Если это так, есть одно приложение для Spring (spring-test), которое содержит MockHttpServletRequest Например:

@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());
            ...
1 голос
/ 09 ноября 2010

Не могу сказать, что это лучший способ сделать это: но для модульного тестирования простого сервлета, подобного этому (без форвардов, контекста и т. Д.), Вы можете просто сделать:

  1. Создание экземпляров макета HttpServletReqeust и HttpServletResponse с использованием любой библиотеки-макета.Еще проще было бы использовать классы RequestWrapper и ResponseWrapper (простые пользовательские классы, реализованные путем расширения классов HttpServletReqeust и HttpServletResponse).
  2. В этих ложных (или пользовательских) экземплярах задайте определенные свойства - параметры, с которыми вы хотите проверить в каждомконтрольный пример - например, op=add для дополнительного модульного теста.Если вы используете пользовательские классы, вы можете просто установить их во внутреннем объекте свойств.Если вы используете mocks, тогда ожидаемые настройки подойдут.
  3. Создайте экземпляр сервлета - new Calculator(), сохраняя необходимые библиотеки в пути к классам.Теперь вызовите метод service для этого экземпляра.
  4. Когда вызов вернется, получите o / p из класса ответа и подтвердите его.Так как класс ответа снова является пользовательским классом или поддельной версией, это должно быть легко.

Для насмешки, просто отправной точкой будет EasyMock или Mockito (моя любимая)

Пример для оболочки: http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/http/HttpServletRequestWrapper.html

HTH

1 голос
/ 09 ноября 2010

Проверьте ServletUnit.Это часть HttpUnit.

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

0 голосов
/ 09 ноября 2010

Как правило, вы должны абстрагировать свою бизнес-логику от деталей контейнера сервлета. Вы можете смоделировать ServletRequest, используя Spring test package , но было бы плохой идеей симулировать контейнер сервлета. Таким образом, вы должны либо запустить системные тесты на реальном контейнере, либо перенести свою логику из сервлета в отдельный компонент и протестировать его изолированно.

  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);
   }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...