views:

341

answers:

3

Currently I'm using TestNG framework for testing application business logic, i added some Servlet classes recently.

How do I unit test these Servlet classes in TestNg framework?

+3  A: 

I suggest that you move all of the business logic out of the servlet classes, into your own classes which you can test. That leaves the servlets just as glue between your business logic and the container, with nothing in them worth testing.

The API classes such as HttpServletRequest, ServletConfig, etc, are prime targets for using a mocking framework of your choice (JMock, Mockito, etc), since they're all interfaces.

skaffman
Thanks Skaffman, my servlets handle session and cookie related operation. So moving these logics to another class is not possible. I'm looking an API which allows me unit test servlet within testNG.
Thomman
@Thomman: It's always possible - just delegate from the servlet to the business logic class. There's nothing that *has* to go in the servlet.
skaffman
+2  A: 

Follow skaffman's advice if possible. If not, or if you want to test the behaviour of the servlets as front-end controllers, rather than the business logic inside them, you can use:

Bozho
Thanks Bozho, does Selenium support TestNG?
Thomman
http://www.ibm.com/developerworks/java/library/j-cq04037/#N100F7
Bozho
+2  A: 

One of the easiest ways is ServletTester from Jetty. Everything is done within embedded Jetty automatically, so there is no port opened during the testing! If you use Maven than the following artifact is required to enable this method:

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

Example:

Prepare ServletTester

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

Create HTTP request

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

Call servlet and retrieve response:

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

Assert what you want to check on response and it's content:

assertEquals(200,response.getStatus()); 
assertEquals("Hello Servlet",response.getContent());
koppernickus
@koppernickus: Can I integrate this test class with TestNG?
Thomman
@Thomman: Yes. This class is independent of any Test Framework.
koppernickus