|
||||
1.0 其他语言
|
||||
5.3 在 VelocityWeb 中不用服务器进行 J2EE 单元测试 |
||||
|
在 VelocityWeb 中,你可以不用启动 J2EE 服务器,进行 J2EE 单元测试。这可以让开发比以前更快。 为了在 VelocityWeb 中的进行单元测试,你需要写一个新的控制器类,比如: public class TestPetStoreController extends PetStoreController { private Log log = LogFactory.getLog(this.getClass()); protected Object getDataSource() { log.debug("getDataSourceByDBCP"); BasicDataSource dataSource = new BasicDataSource(); dataSource.setUrl("jdbc:postgresql:jpetstore"); dataSource.setDriverClassName("org.postgresql.Driver"); dataSource.setUsername("postgres"); dataSource.setPassword("postgres"); return dataSource; } }一般情况下,数据库连接是在应用程序运行时刻通过 JNDI 查找得到的。对于单元测试,我们可以使用 Apache DBCP 来提供连接池。如果应用程序控制器类的其他函数对于单元测试也不适用,你也需要改写 (overwrite) 它们。 你需要写一个新的测试案例(test case)基类: public class VPetStoreDispatcherTestCase extends VelocityWebTestCase { Log log = LogFactory.getLog(this.getClass()); protected void setUp() throws Exception { super.setUp(); } public ControllerServlet getControllerServlet() { return new PetStoreControllerServlet() { public Controller getController() { return new TestPetStoreController(); } }; } public void login(String userId, String password) throws ServletException, IOException { addRequestParameter("username", userId); addRequestParameter("password", password); String url = DispatcherTreeManager.getUrl(LoginProcessDispatcher.class); addRequestParameter("target_dispatcher_url", url); this.doPost(); Object user = this.getController().getSessionUser(getRequest()); log.debug(user); } public void logout() { } }在以上代码中,函数 addRequestParameter() 用来模拟用户在网页上的输入,它可以用来模拟 HTML 网页上的隐藏域(hidden fields)。 现在,你可以写自己的测试案例了: public void testLogin() { try { this.newHttpSession(); newHttpRequest(ShowProcessResultDispatcher.class); // createResponse(); login("j2ee", "j2ee"); // after login, the session should have user object Object sessionUser = this.getController().getSessionUser(getRequest()); assertNotNull(sessionUser); assertProcessSuccess(); //log.debug(getResponseText()); assertContainsResponseString("success"); } catch (Exception e) { log.error(e.getMessage(), e); } } public void testLoginBadPassword() {
如果你一次运行多个测试案例,更好的办法是将所有失败的 HTTP 回应文本写到本地文件中。 |
|||