2010-12-02 3 views
1

Приветствия.Как отключить параметр для обрезанного метода с использованием Mockito

Я высмеиваю поисковую систему для тестирования в своем веб-приложении. Эта поисковая система возвращает 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) так, что, когда она называется, я могу выполните некоторое отключение параметра и убедитесь, что используется другой генератор. Кто-нибудь знает, как я могу добиться чего-то подобного? Или может быть какая-то форма инъекции зависимостей, которая может быть использована для условного подключения моего генератора?

Спасибо!

Update

Я изменил свой объект на заводе так, чтобы он никогда не возвращает двигатель, но, скорее, поиск и найти объекты из этого двигателя, так что теперь я могу сделать что-то вроде этого:

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; 

Другими словами, я все еще хочу отключить строку, которая была передана getSearch в инструкции switch. По общему признанию, я мог бы сделать что-то большее, как предложил Феликс ниже, но я предпочел бы, чтобы все мои дела были завернуты в коммутатор. Может ли кто-нибудь привести пример того, как это можно сделать? Благодаря!

Update

Я видел, что вы можете захватить аргументы, которые передаются в издевался вызовы, но эти захваченные аргументы используются для последующего утверждения. Я не видел способа, которым я могу отключить эти аргументы, чтобы вызов моего макета возвращал разные значения в зависимости от аргументов. Похоже, что должен быть способ сделать это, у меня просто недостаточно опыта работы с 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

если бы я сделать что-то вроде этого, я хотел бы заменить «Foo» с anyString(), но делает выключатель из этой строки, оказывается сложнее. Знаете ли вы хороший способ сделать это? Если да, можете ли вы обновить свой пример? – Samo 2010-12-02 19:46:03

Смежные вопросы