|
|
||||
| 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 回应文本写到本地文件中。 |
|||