Хорошо, как насчет любого фреймворка для java? В общем, это возможно с любым другим фреймворком, или я должен просто создать тупую заглушку, чтобы имитировать поведение, которое я хочу?
Абхиджит Кашня
Ответы:
1001
Вы можете создать ответ в Mockito. Предположим, у нас есть интерфейс с именем Application с методом myFunction.
Это то, что я тоже искал. Спасибо! Моя проблема была другой, хотя. Я хочу смоделировать службу персистентности (EJB), которая хранит объекты и возвращает их по имени.
Migu
7
Я создал дополнительный класс, который оборачивает создание ответа. Таким образом, код читается какwhen(...).then(Return.firstParameter())
SpaceTrucker
69
С Java 8 лямбды это ужин легко вернуть первый аргумент, даже для конкретного класса, то есть when(foo(any()).then(i -> i.getArgumentAt(0, Bar.class)). И вы также можете использовать ссылку на метод и вызывать реальный метод.
Павел Дида
Это решает мою проблему с методом return, Iterator<? extends ClassName>который вызывает всевозможные проблемы приведения в thenReturn()выражении.
Михаил Шопсин
16
С Java 8 и Mockito <1.9.5 , то ответ Pawel становитсяwhen(foo(any()).thenAnswer(i -> i.getArguments()[0])
Graeme Мосс
567
Если у вас Mockito 1.9.5 или выше, есть новый статический метод, который может сделать Answerобъект для вас. Вам нужно написать что-то вроде
Обратите внимание, что returnsFirstArg()метод является статическим в AdditionalAnswersклассе, который является новым для Mockito 1.9.5; так что вам нужен правильный статический импорт.
Примечание: это when(...).then(returnsFirstArg()), я по ошибке имел, when(...).thenReturn(returnsFirstArg())который далjava.lang.ClassCastException: org.mockito.internal.stubbing.answers.ReturnsArgumentAt cannot be cast to
Бенедикт Кеппел
1
Примечание: returnFirstArg () возвращает Answer <>, а не значение аргумента. Полученный 'Foo (java.lang.String) не может быть применен к' (org.mockito.stubbing.Answer <java.lang.Object>) 'при попытке вызвать .thenReturn (новый Foo (returnFirstArg ()))
Lu55
Мне всегда нужно гуглить этот ответ снова и снова и снова в течение последних лет, так как я просто не могу вспомнить «Дополнительные ответы», и он мне нужен очень редко. Тогда мне интересно, как, черт возьми, я могу построить этот сценарий, так как я не могу найти необходимые зависимости. Разве это не может быть добавлено непосредственно в mockito? : /
BAERUS
2
Ответ Стива более общий. Это только позволяет вам вернуть необработанный аргумент. Если вы хотите обработать этот аргумент и вернуть результат, тогда ответьте Стиву. Я проголосовал за обоих, поскольку они оба полезны.
Акостадинов
К вашему сведению, мы должны импортировать static org.mockito.AdditionalAnswers.returnsFirstArg. это использовать returnFirstArg. Кроме того, я могу сделать when(myMock.myFunction(any())).then(returnsFirstArg())в Mockito 2.20. *
gtiwari333
78
С помощью Java 8 можно создать однострочный ответ даже в более старой версии Mockito:
Конечно, это не так полезно, как использование AdditionalAnswersпредложенного Дэвидом Уоллесом, но может быть полезно, если вы хотите преобразовать аргумент «на лету».
Brilliant. Спасибо. Если аргумент есть long, это все еще может работать с боксом и Long.class?
Викингстев
1
.getArgumentAt (..) не был найден для меня, но .getArgument (1) сработал (mockito 2.6.2)
Кертис Яллоп
41
У меня была очень похожая проблема. Цель состояла в том, чтобы издеваться над сервисом, который сохраняет объекты и может вернуть их по имени. Сервис выглядит так:
Это довольно старый вопрос, но я думаю, что все еще актуален. Также принятый ответ работает только для String. Между тем есть Mockito 2.1, и некоторые импортные данные изменились, поэтому я хотел бы поделиться своим текущим ответом:
importstatic org.mockito.AdditionalAnswers.returnsFirstArg;importstatic org.mockito.ArgumentMatchers.any;importstatic org.mockito.Mockito.when;@MockprivateMyClass myClass;// this will return anything you pass, but it's pretty unrealistic
when(myClass.myFunction(any())).then(returnsFirstArg());// it is more "life-like" to accept only the right type
when(myClass.myFunction(any(ClassOfArgument.class))).then(returnsFirstArg());
Я использую что-то подобное (в основном это тот же подход). Иногда полезно, чтобы фиктивный объект возвращал заранее определенные выходные данные для определенных входных данных. Это идет так:
privateHashtable<InputObject,OutputObject> table =newHashtable<InputObject,OutputObject>();
table.put(input1, ouput1);
table.put(input2, ouput2);...
when(mockObject.method(any(InputObject.class))).thenAnswer(newAnswer<OutputObject>(){@OverridepublicOutputObject answer(finalInvocationOnMock invocation)throwsThrowable{InputObject input =(InputObject) invocation.getArguments()[0];if(table.containsKey(input)){return table.get(input);}else{returnnull;// alternatively, you could throw an exception}}});
Это немного старый, но я пришел сюда, потому что у меня была та же проблема. Я использую JUnit, но на этот раз в приложении Kotlin с mockk. Я публикую здесь пример для сравнения и сравнения с Java-аналогом:
@Test
fun demo(){// mock a sample function
val aMock:(String)->(String)= mockk()// make it return the same as the argument on every invocation
every {
aMock.invoke(any())} answers {
firstArg()}// test it
assertEquals("senko", aMock.invoke("senko"))
assertEquals("senko1", aMock.invoke("senko1"))
assertNotEquals("not a senko", aMock.invoke("senko"))}
//Use ArgumentCaptor to capture the valueArgumentCaptor<String> param =ArgumentCaptor.forClass(String.class);
when(mock.myFunction(param.capture())).thenAnswer(newAnswer<String>(){@OverridepublicString answer(InvocationOnMock invocation)throwsThrowable{return param.getValue();//return the captured value.}});
ИЛИ, если вы поклонник лямбды, просто сделайте:
//Use ArgumentCaptor to capture the valueArgumentCaptor<String> param =ArgumentCaptor.forClass(String.class);
when(mock.myFunction(param.capture())).thenAnswer((invocation)-> param.getValue());
Сводка: используйте аргумент capc, чтобы захватить переданный параметр. Позже в ответе вернуть значение, полученное с помощью getValue.
Это не работает (больше?). Относительно документов: Этот метод должен использоваться внутри проверки. Это означает, что вы можете захватить значение только при использовании метода проверки
Мухаммед Мисир
1. Не уверен, что вы имеете в виду, у This doesn´t work (anymore?).меня есть это работает на моем экземпляре. 2. Извините, мне непонятно, что вы пытаетесь сделать. Ответ специфичен для вопроса ОП.
Ответы:
Вы можете создать ответ в Mockito. Предположим, у нас есть интерфейс с именем Application с методом myFunction.
Вот метод теста с ответом Mockito:
Начиная с Mockito 1.9.5 и Java 8, вы также можете использовать лямбда-выражение:
источник
when(...).then(Return.firstParameter())
when(foo(any()).then(i -> i.getArgumentAt(0, Bar.class))
. И вы также можете использовать ссылку на метод и вызывать реальный метод.Iterator<? extends ClassName>
который вызывает всевозможные проблемы приведения вthenReturn()
выражении.when(foo(any()).thenAnswer(i -> i.getArguments()[0])
Если у вас Mockito 1.9.5 или выше, есть новый статический метод, который может сделать
Answer
объект для вас. Вам нужно написать что-то вродеили альтернативно
Обратите внимание, что
returnsFirstArg()
метод является статическим вAdditionalAnswers
классе, который является новым для Mockito 1.9.5; так что вам нужен правильный статический импорт.источник
when(...).then(returnsFirstArg())
, я по ошибке имел,when(...).thenReturn(returnsFirstArg())
который далjava.lang.ClassCastException: org.mockito.internal.stubbing.answers.ReturnsArgumentAt cannot be cast to
static org.mockito.AdditionalAnswers.returnsFirstArg
. это использовать returnFirstArg. Кроме того, я могу сделатьwhen(myMock.myFunction(any())).then(returnsFirstArg())
в Mockito 2.20. *С помощью Java 8 можно создать однострочный ответ даже в более старой версии Mockito:
Конечно, это не так полезно, как использование
AdditionalAnswers
предложенного Дэвидом Уоллесом, но может быть полезно, если вы хотите преобразовать аргумент «на лету».источник
long
, это все еще может работать с боксом иLong.class
?У меня была очень похожая проблема. Цель состояла в том, чтобы издеваться над сервисом, который сохраняет объекты и может вернуть их по имени. Сервис выглядит так:
Служба макет использует карту для хранения экземпляров комнаты.
Теперь мы можем запустить наши тесты на этом макете. Например:
источник
С Java 8 ответ Стива может стать
РЕДАКТИРОВАТЬ: еще короче:
источник
Это довольно старый вопрос, но я думаю, что все еще актуален. Также принятый ответ работает только для String. Между тем есть Mockito 2.1, и некоторые импортные данные изменились, поэтому я хотел бы поделиться своим текущим ответом:
MyClass.myFunction будет выглядеть так:
источник
Я использую что-то подобное (в основном это тот же подход). Иногда полезно, чтобы фиктивный объект возвращал заранее определенные выходные данные для определенных входных данных. Это идет так:
источник
Возможно, вы захотите использовать verify () в сочетании с ArgumentCaptor для обеспечения выполнения в тесте и ArgumentCaptor для оценки аргументов:
Значение аргумента, очевидно, доступно через arguments.getValue () для дальнейшей манипуляции / проверки / чего угодно.
источник
Это немного старый, но я пришел сюда, потому что у меня была та же проблема. Я использую JUnit, но на этот раз в приложении Kotlin с mockk. Я публикую здесь пример для сравнения и сравнения с Java-аналогом:
источник
Вы можете достичь этого с помощью ArgumentCaptor
Представьте, что у вас есть функция боба, вот так.
Тогда в вашем тестовом классе:
ИЛИ, если вы поклонник лямбды, просто сделайте:
Сводка: используйте аргумент capc, чтобы захватить переданный параметр. Позже в ответе вернуть значение, полученное с помощью getValue.
источник
This doesn´t work (anymore?).
меня есть это работает на моем экземпляре. 2. Извините, мне непонятно, что вы пытаетесь сделать. Ответ специфичен для вопроса ОП.