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() {
try {
this.newHttpSession();
newHttpRequest(ShowProcessResultDispatcher.class);
// createResponse();
login("j2ee", "j2ee_abc");
assertProcessFail();
assertContainsResponseString("error");
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}


你也可以将 HTTP 回应文本写到本地文件中,然后检查。

如果你一次运行多个测试案例,更好的办法是将所有失败的 HTTP 回应文本写到本地文件中。