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