我嘲笑搜索引擎在我的web應用程序中進行測試。該搜索引擎返回具有不同模式的xml文檔。該架構取決於稱爲集合集的參數。基於集合集合返回不同的模式是難以模擬的部分,因爲指定集合集合基本上是一種設置方法,並且在此處是無效的。這個搜索引擎是一個外部的jar文件,所以我不能修改這個API。我必須處理所提供的內容。這裏有一個例子:
Engine engine = factory.getEngine();
Search search = engine.getSearch();
search.addCollectionSet(someCollectionSet);
SearchResult result = search.getSearchResult();
Document[] documents = result.getAllDocuments();
然後對每個文檔,我可以通過調用獲取XML:當我用我的模仿對象
document.getDocumentText();
,getDocumentText()
返回XML字符串,由發電機產生,符合架構。我想要做的是使用不同類型的生成器,具體取決於上面第一個代碼片段中步驟3中提供的收集集合。我一直在試圖做這樣的事情:
doAnswer(new Answer() {
Object answer(InvocationOnMock invocation) {
if (args == "foo") {
SearchResult result = getMockSearchResult();
when(search.getSearchResult()).thenReturn(result);
}
}
}).when(search.addCollectionSet(anyString()));
但是這會導致大量的紅色高亮:)
基本上,我的目標是關閉的addCollectionSet(someCollectionSet)
這樣,當它的名字,我可以鍵入做一些關閉參數的操作,並確保使用不同的發生器。有誰知道我可以如何完成這樣的事情?或者是否有某種形式的依賴注入可以用來有條件地連接我的發生器?
謝謝!
更新
我已經改變了我廠的對象,以便它永遠不會返回的發動機,而是將搜索和查找發動機的對象,所以現在我可以做這樣的事情:
Search search = factory.getSearch(collectionSet);
所以我想要做的是這樣的:
when(factory.getSearch(anyString()).thenAnswer(new Answer() {
Object answer(InvocationOnMock invocation) {
switch(args[0]) {
case fooSet: return fooSearch; break;
case barSet: return barSearch; break;
換句話說,我仍然想要關閉在switch語句中傳遞給getSearch的字符串。無可否認,我可以做更像felix在下面提出的建議,但我寧願讓我的所有案例都包含在一個開關中。有人可以提供一個如何做到這一點的例子嗎?謝謝!
更新
我已經看到了你可以捕捉傳遞到嘲笑調用的參數,而這些參數捕捉用於以後的斷言。我還沒有看到一種方法,我可以鍵入這些參數,以便對我的模擬的調用將根據參數返回不同的值。似乎有必要做到這一點,我只是沒有足夠的經驗與Mockito找出答案。但肯定有人會這樣做!
如果我要做這樣的事情,我想用anyString()替換「foo」,但是切斷該字符串被證明是棘手的。你知道這樣做的好方法嗎?如果是這樣,你能更新你的例子嗎? – Samo 2010-12-02 19:46:03