Ok, a co z jakimkolwiek frameworkiem javingowym w ogóle ... Czy jest to możliwe w przypadku innych frameworków, czy też powinienem po prostu stworzyć głupi kodeks naśladujący pożądane zachowanie?
Abhijeet Kashnia
Odpowiedzi:
1001
Możesz utworzyć odpowiedź w Mockito. Załóżmy, że mamy interfejs o nazwie Aplikacja z metodą myFunction.
Tego też szukałem. Dziękuję Ci! Mój problem był jednak inny. Chcę wyśmiewać usługę trwałości (EJB), która przechowuje obiekty i zwraca je według nazwy.
migu
7
Stworzyłem dodatkową klasę, która otacza tworzenie odpowiedzi. Więc kod brzmi jakwhen(...).then(Return.firstParameter())
SpaceTrucker
69
W lambdach Java 8 kolacja łatwo zwraca pierwszy argument, nawet dla konkretnej klasy, tj when(foo(any()).then(i -> i.getArgumentAt(0, Bar.class)). Równie dobrze możesz użyć odwołania do metody i wywołać prawdziwą metodę.
Paweł Dyda
To rozwiązuje mój problem z metodą zwrotów, Iterator<? extends ClassName>która powoduje wszelkiego rodzaju problemy z rzutowaniem w thenReturn()instrukcji.
Michael Shopsin
16
W Javie 8 i Mockito <1.9.5 odpowiedź Pawła brzmiwhen(foo(any()).thenAnswer(i -> i.getArguments()[0])
Graeme Moss
566
Jeśli masz Mockito w wersji 1.9.5 lub nowszej, istnieje nowa metoda statyczna, która może uczynić Answerobiekt dla Ciebie. Musisz napisać coś takiego
Zauważ, że returnsFirstArg()metoda jest statyczna w AdditionalAnswersklasie, co jest nowością w Mockito 1.9.5; więc potrzebujesz odpowiedniego importu statycznego.
Uwaga: to when(...).then(returnsFirstArg()), że przez pomyłkę miałem, when(...).thenReturn(returnsFirstArg())który dałjava.lang.ClassCastException: org.mockito.internal.stubbing.answers.ReturnsArgumentAt cannot be cast to
Benedikt Köppel
1
Uwaga: returnFirstArg () zwraca odpowiedź <> zamiast wartości argumentu. Dostał „Foo (java.lang.String) nie można zastosować do” (org.mockito.stubbing.Answer <java.lang.Object>) ”podczas próby wywołania .thenReturn (new Foo (returnFirstArg ()))
Lu55
Zawsze muszę wyszukiwać w Google tę odpowiedź raz po raz przez ostatnie lata, ponieważ po prostu nie pamiętam „Dodatkowych odpowiedzi” i potrzebuję ich bardzo rzadko. Potem zastanawiam się, jak do cholery mogę zbudować ten scenariusz, ponieważ nie mogę znaleźć niezbędnych zależności. Czy nie można tego dodać bezpośrednio do mockito? : /
BAERUS
2
Odpowiedź Steve'a jest bardziej ogólna. Ten pozwala tylko zwrócić surowy argument. Jeśli chcesz przetworzyć ten argument i zwrócić wynik, wówczas reguła odpowiedzi Steve'a. Poparłem oba, ponieważ są one przydatne.
akostadinov,
Do Twojej wiadomości musimy importować static org.mockito.AdditionalAnswers.returnsFirstArg. to, aby użyć returnFirstArg. Mogę też zrobić when(myMock.myFunction(any())).then(returnsFirstArg())w Mockito 2.20. *
gtiwari333
77
W Javie 8 możliwe jest utworzenie odpowiedzi w jednym wierszu, nawet w przypadku starszej wersji Mockito:
Oczywiście nie jest to tak przydatne, jak użycie AdditionalAnswerssugerowane przez Davida Wallace'a, ale może być przydatne, jeśli chcesz przekształcić argument „w locie”.
To dość stare pytanie, ale myślę, że nadal jest aktualne. Również zaakceptowana odpowiedź działa tylko dla String. Tymczasem jest Mockito 2.1 i niektóre importy uległy zmianie, dlatego chciałbym podzielić się moją obecną odpowiedzią:
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());
Używam czegoś podobnego (w zasadzie jest to to samo podejście). Czasami przydatne jest, aby sztuczny obiekt zwracał wstępnie zdefiniowane dane wyjściowe dla niektórych danych wejściowych. To wygląda tak:
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}}});
To jest trochę stare, ale przyszedłem tutaj, ponieważ miałem ten sam problem. Używam JUnit, ale tym razem w aplikacji Kotlin z mockk. Zamieszczam tutaj próbkę w celach informacyjnych i porównawczych z odpowiednikiem 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.}});
LUB jeśli jesteś fanem lambda, po prostu wykonaj:
//Use ArgumentCaptor to capture the valueArgumentCaptor<String> param =ArgumentCaptor.forClass(String.class);
when(mock.myFunction(param.capture())).thenAnswer((invocation)-> param.getValue());
Podsumowanie: Użyj argumentcaptor, aby przechwycić przekazany parametr. Później w odpowiedzi zwraca wartość przechwyconą za pomocą getValue.
To nie działa (już?). W odniesieniu do dokumentów: Tę metodę należy zastosować w ramach weryfikacji. Oznacza to, że możesz uchwycić tę wartość tylko przy użyciu metody weryfikacji
Muhammed Misir
1. Nie jestem pewien, co masz na myśli przez This doesn´t work (anymore?).to, że działam w mojej instancji. 2. Przepraszam, nie mam jasności co do tego, co próbujesz zrobić. Odpowiedź jest specyficzna dla pytania OP.
Odpowiedzi:
Możesz utworzyć odpowiedź w Mockito. Załóżmy, że mamy interfejs o nazwie Aplikacja z metodą myFunction.
Oto metoda testowa z odpowiedzią Mockito:
Od wersji Mockito 1.9.5 i Java 8 można również użyć wyrażenia lambda:
źródło
when(...).then(Return.firstParameter())
when(foo(any()).then(i -> i.getArgumentAt(0, Bar.class))
. Równie dobrze możesz użyć odwołania do metody i wywołać prawdziwą metodę.Iterator<? extends ClassName>
która powoduje wszelkiego rodzaju problemy z rzutowaniem wthenReturn()
instrukcji.when(foo(any()).thenAnswer(i -> i.getArguments()[0])
Jeśli masz Mockito w wersji 1.9.5 lub nowszej, istnieje nowa metoda statyczna, która może uczynić
Answer
obiekt dla Ciebie. Musisz napisać coś takiegolub alternatywnie
Zauważ, że
returnsFirstArg()
metoda jest statyczna wAdditionalAnswers
klasie, co jest nowością w Mockito 1.9.5; więc potrzebujesz odpowiedniego importu statycznego.źródło
when(...).then(returnsFirstArg())
, że przez pomyłkę miałem,when(...).thenReturn(returnsFirstArg())
który dałjava.lang.ClassCastException: org.mockito.internal.stubbing.answers.ReturnsArgumentAt cannot be cast to
static org.mockito.AdditionalAnswers.returnsFirstArg
. to, aby użyć returnFirstArg. Mogę też zrobićwhen(myMock.myFunction(any())).then(returnsFirstArg())
w Mockito 2.20. *W Javie 8 możliwe jest utworzenie odpowiedzi w jednym wierszu, nawet w przypadku starszej wersji Mockito:
Oczywiście nie jest to tak przydatne, jak użycie
AdditionalAnswers
sugerowane przez Davida Wallace'a, ale może być przydatne, jeśli chcesz przekształcić argument „w locie”.źródło
long
, czy to może nadal działać z boksem iLong.class
?Miałem bardzo podobny problem. Celem było wykpienie usługi, która utrwala Obiekty i może zwrócić je po nazwie. Usługa wygląda następująco:
Makieta usługi używa mapy do przechowywania instancji pokoju.
Możemy teraz uruchomić nasze testy na tej makiecie. Na przykład:
źródło
W Javie 8 odpowiedź Steve'a może się stać
EDYCJA: Jeszcze krótsza:
źródło
To dość stare pytanie, ale myślę, że nadal jest aktualne. Również zaakceptowana odpowiedź działa tylko dla String. Tymczasem jest Mockito 2.1 i niektóre importy uległy zmianie, dlatego chciałbym podzielić się moją obecną odpowiedzią:
Funkcja myClass.myF wygląda następująco:
źródło
Używam czegoś podobnego (w zasadzie jest to to samo podejście). Czasami przydatne jest, aby sztuczny obiekt zwracał wstępnie zdefiniowane dane wyjściowe dla niektórych danych wejściowych. To wygląda tak:
źródło
Możesz użyć Verify () w połączeniu z ArgumentCaptor, aby zapewnić wykonanie testu i ArgumentCaptor do oceny argumentów:
Wartość argumentu jest oczywiście dostępna poprzez argument.getValue () w celu dalszej manipulacji / sprawdzania / czegokolwiek.
źródło
To jest trochę stare, ale przyszedłem tutaj, ponieważ miałem ten sam problem. Używam JUnit, ale tym razem w aplikacji Kotlin z mockk. Zamieszczam tutaj próbkę w celach informacyjnych i porównawczych z odpowiednikiem Java:
źródło
Możesz to osiągnąć za pomocą ArgumentCaptor
Wyobraź sobie, że masz taką funkcję fasoli.
Następnie w klasie testowej:
LUB jeśli jesteś fanem lambda, po prostu wykonaj:
Podsumowanie: Użyj argumentcaptor, aby przechwycić przekazany parametr. Później w odpowiedzi zwraca wartość przechwyconą za pomocą getValue.
źródło
This doesn´t work (anymore?).
to, że działam w mojej instancji. 2. Przepraszam, nie mam jasności co do tego, co próbujesz zrobić. Odpowiedź jest specyficzna dla pytania OP.