java
Servlet için Test Driven Development
by solomon on Jun.06, 2010, under java, Programming, Tech
Test driven development çok önemli bir olay. Standard java projelerinde junit kullanıyorum. Ancak bir web uygulaması yazıyorsanız servlet’leri test etmek bir dert olabilir.
Daha önce bu meseleyi şu şekilde çözüyordum: model ve controller class’larım için junit testlerimi yazıyor, servletlerin logic’ini daha basit bırakıyordum. Ancak yeni işimde (Oyun stüdyosu) komplex servlet implementasyonu ile karşılaştığım için servlet testi yazmam farz oldu.
Servlet’lerdeki testing problemi şu: bir container’a (tomcat gibi) ihtiyacınız var. Lakin muhteşem kütüphane HttpUnit kendi build-in container implikasyonuyla (türkçesini bilemedim) geliyor.
Kurulum için web sitesinden kaynağı indirip, jar ve dependency kutuphaneleri classpath inize eklemelisiniz.
Neyse lafı kısa kesip örneğe geçeyim. Örnek olabilecek en basit servlet testi. Ama giriş için iyidir bence.
Test kodu aşağıdaki gibi, bu benim için çalışan konfigurasyon.
@Test
public void testServlet() throws IOException, SAXException, ServletException {
File webXml = new File("./web/WEB-INF/web.xml");
// web.xml deki servlet tanımlarından olayi cozuyor
ServletRunner sr = new ServletRunner(webXml, "/BeerV1");
// servlet asagidaki gibi register de edilebiliyor ayrıca.
// sr.registerServlet("BeerSelect", BeerSelect.class.getName());
ServletUnitClient sc = sr.newClient();
WebRequest req = new PostMethodWebRequest("http://localhost:8080/BeerV1/BeerSelect.do");
req.setParameter("color", "Light");
InvocationContext ic = sc.newInvocation(req);
BeerSelect bs = (BeerSelect) ic.getServlet();
String servletInfo = bs.getServletInfo();
assertEquals("The servlet info is wrong", servletInfo, "My super beer selector");
// evet invocation context kullandıgımız için servlet metodlarını manual olarak cagiriyoruz.
bs.doPost(ic.getRequest(), ic.getResponse());
String color = bs.getColor();
assertEquals("The color is wrong", color, "Efes Light" );
}
Bu da servlet
public class BeerSelect extends HttpServlet {
private String _color = "";
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
try{
String email = this.getServletConfig().getInitParameter("email");
request.setAttribute("email", email);
out.println("
Beer advisor
");
BeerExpert exp = new BeerExpert();
List res = exp.getBrands(request.getParameter("color"));
request.setAttribute("styles", res);
for( String s : res ){
this.setColor(this.getColor() + s);
}
RequestDispatcher dsp = request.getRequestDispatcher("result.jsp");
dsp.forward(request, response);
} finally {
out.close();
}
}
@Override
public String getServletInfo() {
return "My super beer selector";
}
public String getColor() {
return _color;
}
public void setColor(String _color) {
this._color = _color;
}
}
Bu kadar