|
||||
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 回應文字寫到本地檔案中。 |
|||