2010-12-02 31 views
1

問候。如何使用Mockito將參數鍵入到存根方法

我嘲笑搜索引擎在我的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找出答案。但肯定有人會這樣做!

回答

1

我建議將對傳統代碼的調用包裝到自己的對象中。 所以你最終沿着這些線路你自己的方法:

class SearchEngineWrapper { 
    public String getSearchResult(String collection){ 
    Engine engine = factory.getEngine(); 
    Search search = engine.getSearch(); 
    search.addCollectionSet(someCollectionSet); 
    SearchResult result = search.getSearchResult(); 
    ... 
    return document.getDocumentText(); 
    } 
} 

現在你可以模擬出這種方法。該方法也很好地記錄你的意圖。你也可以在集成測試中測試實際的實現。

when(searchEngineWrapper.getSearchResult("abc").thenReturn("foo"); 
when(searchEngineWrapper.getSearchResult("xyz").thenReturn("bar"); 
+0

如果我要做這樣的事情,我想用anyString()替換「foo」,但是切斷該字符串被證明是棘手的。你知道這樣做的好方法嗎?如果是這樣,你能更新你的例子嗎? – Samo 2010-12-02 19:46:03

相關問題