全部博文(89)
分类: Java
2009-03-31 22:47:04
过去工作中,我常常听一些共事的人讲这样的话,“我的程序不可能有问题”,但结果恰恰总是事与愿违,这些人的自大往往导致了程序无法运行。事实证明,人无完人,人的思维不可能是尽善尽美的。对于我来讲,与不写的测试的人共事,是件相当头痛的事。测试能够有效提高软件的质量,将bug数量降低到最低。对于程序员,首先要做的是单元测试。
Pragmatic Programmer, The: From Journeyman to Master一书中 Tip 27为“Don't Assume It—Prove It”,道出了测试的真谛。
以 helloworld 为例,测试 HelloActionBean。
public class HelloActionBeanTest {
@Test
public void sayHello(){
HelloActionBean hello=new HelloActionBean();
hello.setContext(new ActionBeanContext());
hello.setMessage("Stripes!");
hello.sayHello();
Assert.assertEquals("Hello,Stripes!", hello.getMessage());
}
}
因为 ActionBean
是一个POJO 类,测试内部逻辑并不困难,因为它不依赖容器类,如 HttpServletRequest
,Session,Cookie等。如果要测试这种类相关的逻辑,单纯依靠 TestNG 可能比较难实现。但是,Stripes 提供一套测试 提供了 testng for eclipse。NetBeans 的nightly build 也支持 TestNG ,参见。
在 net.sourceforge.stripes.mock
包中提供多个 Mock类。其中包括 MockHttpServletRequest,MockSession等。有了这些类,你可以脱离容器的情况下,模拟 servlet 容器环境。
public class HelloIntegratedTest {
MockServletContext context;
@BeforeTest
public void setupNonTrivialObjects() {
context = new MockServletContext("testing");
// Add the Stripes Filter
MapfilterParams = new HashMap ();
filterParams.put("ActionResolver.Packages", "tutorial.action");
context.addFilter(StripesFilter.class, "StripesFilter", filterParams);
// Add the Stripes Dispatcher
context.setServlet(DispatcherServlet.class, "StripesDispatcher", null);
}
@Test
public void sayHelloTest() throws Exception {
// Setup the servlet engine
MockRoundtrip trip = new MockRoundtrip(context, HelloActionBean.class);
trip.setParameter("message", "Stripes!");
trip.execute("sayHello");
HelloActionBean bean = trip.getActionBean(HelloActionBean.class);
Assert.assertEquals("Hello,Stripes!", bean.getMessage());
Assert.assertEquals(trip.getDestination(), "/greeting.jsp");
}
}