2012-07-18 31 views
0

所以我有我要執行單元測試的波紋管方法。使用easymock測試一個方法的單元

public List<Project> getProjects(Task task) { 

    Criteria<Project> criteria = this.myRepository.getCriteria(Project.class); 
    criteria.add(Comparison.eq("order", task.getOrder())); 
    criteria.addOrder(Order.asc("projectNumber")); 
    return this.myRepository.findList(Project.class, criteria); 
} 

所以它實際上得到的任務對象(這是一個JPA模型對象),去扔項目表,並認爲所有有此項目的訂單項目。訂單在兩個表中都很常見。

反正,查詢本身並不是那個imp。它查詢數據庫並返回一些數據。現在我的問題如何使用easymock對此進行單元測試?

@Test 
public void testGetProjects() throws Exception { 
    myRepository = new CreateMyRepositoryWrapper(); --> This is a class which just returns the entityManger. but here we can consider this as a pojo. 

    Task task = EasyMock.createNiceMock(Task.class); 
    Order bom = EasyMock.createNiceMock(Order.class);   
    Project project= EasyMock.createNiceMock(Project.class); 

    project.setProjectName("project"); ------> Can I call a seeter on a mocked object? 

    project.setProjectNumber("1"); 

    EasyMock.replay(project); 

    List projects= new ArrayList(Arrays.asList(project)); 
    bom.setProjects(projects); ------------> Does it make sense to do this? 

    EasyMock.expect(task.getOrders()).andReturn(bom); 
    TestClass instance = new TestClass(); 
    instance.setMyRepository(myRepository); 

    EasyMock.replay(task,bom); 
    instance.getProjects(task); 

} 

所以這通過了測試用例。但我不確定所有那些嘲笑我正在測試的東西。因爲它只是表明這些方法正在被調用。但是,既然他們被嘲笑了,我不確定我是否可以使用assertEquals,即使我可以得到一個異常因爲我必須添加更多上面的代碼,我認爲。

所以我的問題:對於提到的方法什麼應該是適當的單元測試用例?

謝謝。

回答

1

我想你有這個嘲諷倒退。模擬myRepostory,然後設置myRepository模擬以返回Criteria對象,並在Criteria對象傳遞給findList時返回項目列表。

任務,訂單和項目可能只是實例化。

現在,instance.getProjects(task)會返回一些東西。您可以檢查以確保返回的內容與您所說的應該從findList返回的內容相同。現在你已經測試了一些東西,儘管沒有特別有趣。

您可能想要驗證標準對象在傳遞給findList之前是否設置正確。要做到這一點,你必須制定一個模擬標準,然後你可以設定你所要求的方法的期望。這裏棘手的部分是Hibernate Restriction類沒有非默認的equals實現,因此您必須編寫自己的匹配程序來檢查傳遞給條件的限制與您期望的限制相同(功能上)。

另一種可能性是將條件設置爲實際的Criteria對象。 (你仍然設置你的myRepository模擬來返回它)。然後,在函數被調用之後,你可以用toString()方法或者你知道檢查Criteria對象的其他任何方式檢查內容。

最後的(單元測試)可能性是不對標準對象使用模擬框架,但是您編寫的手動編碼框架允許您檢查添加到其中的所有限制。

所有這些都爲這種方法提供了一個很好的例子,實際上它正在集成測試中進行測試。你做了很多工作來驗證一些不是很有趣的事情,如果你試圖重構代碼,你的測試會變得非常脆弱。 (我自己做過,所以我從經驗中發言。)

+0

非常感謝您的時間。但我不明白的是,如果我嘲笑倉庫對象,並告訴它在findList調用時返回這些項目。然後它會返回我所說的。那麼我應該怎樣比較它,當我告訴它返回我想要的東西時,它會返回我想要的東西,無論標準是否有效。唯一的事情是我可以初始項目,然後檢查標準是否正確。但是,我也可以檢查它是否也會使用嘲諷庫來返回正確的東西? – Sara 2012-07-19 17:52:12

+0

我在這裏嘲笑的問題是,如果我嘲笑知識庫並告訴它我期待的返回類型,那麼我怎樣才能測試它是否返回正確的數據呢?我錯過了什麼嗎? – Sara 2012-07-19 17:54:47

+1

單元測試(而不是集成測試)的要點是你不想測試'CreateMyRepositoryWrapper'。你認爲那個班級會正常工作(基於其他測試,你希望)。在嘲笑中,你說,「假設myRepository做到這一點 - 這種方法是否按我的預期工作?」通過這種方式,您可以輕鬆測試其他場景,例如'myRepository.findList'返回null - 是否要從此方法返回null或空列表?假設'myRepository.findList'拋出一個異常 - 我想處理這個異常還是讓它級聯? – jhericks 2012-07-19 20:12:27