現在,我們使用 EasyMockTemplate 重新建立測試:
@Test public void shouldAddNewEmployee() { EasyMockTemplate t = new EasyMockTemplate(mockEmployeeDao) { @Override protected void expectations() { mockEmployeeDAO.insert(employee); } @Override protected void codeToTest() { employeeBO.addNewEmployee(employee); } }; t.run(); } @Test public void shouldUpdateEmployee() { EasyMockTemplate t = new EasyMockTemplate(mockEmployeeDao) { @Override protected void expectations() { mockEmployeeDAO.update(employee); } @Override protected void codeToTest() { employeeBO.updateEmployee(employee); } }; t.run(); } EasyMockTemplate可以帶來以下優點:
- 因expectations和codeToTest方法是抽象的,故EasyMockTemplate會強制開發人員指定期望結果和要測試的代碼,從而減少程序錯誤。
- 可以明確區分期望結果和要測試的代碼,這使測試更容易理解和維護。
- 避免了代碼重復,因為我們不必再去調用replay和verify方法了。
您可以從 此處 下載EasyMockTemplate 的最新版本。
Mock測試可能是脆弱的
Mock測試屬于白盒測試,它需要非常熟悉類的內部知識。這是Mock交互特性的副作用。對方法實現的合理修改可能會破壞使用Mock的測試,即便這種方法的運行結果是相同的。
在本例中,EmployeeBO將與EmployeeDAO交互,并使用簡單JDBC將員工信息存儲于數據庫中。假設我們改變了在數據庫中存儲信息的方式――比如說,將JDBC改為JPA――使用EmployeeJPA替換EmployeeDAO,并在相同的數據庫表中存儲相同的信息。我們期望已有測試會通過,因為輸出(將數據存儲在數據庫中)沒有改變。遺憾的是,我們的測試將以失敗告終,因為EmployeeBO和EmployeeDAO之間的交互已經不復存在:現在,EmployeeBO將使用EmployeeJPA在數據庫中存儲數據,如圖2所示。
延伸閱讀
文章來源于領測軟件測試網 http://www.kjueaiud.com/