Модульный тест сервлетов - PullRequest
       34

Модульный тест сервлетов

5 голосов
/ 03 апреля 2010

В настоящее время я использую среду TestNG для тестирования бизнес-логики приложения, недавно я добавил несколько классов сервлетов.

Как мне выполнить модульное тестирование этих классов сервлетов в среде TestNg?

Ответы [ 3 ]

18 голосов
/ 03 апреля 2010

Одним из самых простых способов является ServletTester от Jetty. Все делается внутри встроенного Jetty автоматически, поэтому во время тестирования порт не открывается! Если вы используете Maven, то для включения этого метода требуется следующий артефакт:

<dependency>
  <groupId>org.mortbay.jetty</groupId>
  <artifactId>jetty-servlet-tester</artifactId>
  <version>6.1.16</version>
  <scope>test</scope>
</dependency>

Пример:

Подготовить ServletTester

ServletTester tester=new ServletTester(); 
tester.addServlet(HelloServlet.class, "/hello"); 
tester.start();

Создать HTTP-запрос

HttpTester request = new HttpTester(); 
request.setMethod("GET");
request.setHeader("Host","tester"); 
request.setURI("/hello");
request.setVersion("HTTP/1.0");

Вызов сервлета и получение ответа:

HttpTester response = new HttpTester();
response.parse(tester.getResponses(request.generate()));

Укажите, что вы хотите проверить в ответе и его содержимом:

assertEquals(200,response.getStatus()); 
assertEquals("Hello Servlet",response.getContent());
8 голосов
/ 03 апреля 2010

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

Классы API, такие как HttpServletRequest, ServletConfig и т. Д., Являются основными целями для использования фреймворка по вашему выбору (JMock, Mockito и т. Д.), Поскольку все они являются интерфейсами.

6 голосов
/ 03 апреля 2010

Следуйте советам скаффмана, если это возможно. Если нет или если вы хотите проверить поведение сервлетов в качестве внешних контроллеров, а не бизнес-логику внутри них, вы можете использовать:

...