wake-up-neo.com

Mockito-Ausnahme - when () erfordert ein Argument, das ein Methodenaufruf bei einem Mock sein muss

Ich habe einen sehr einfachen Testfall, der Mockito und Spring Test Framework verwendet. Wenn ich tue 

when(pcUserService.read("1")).thenReturn(pcUser);

Ich bekomme diese Ausnahme. 

org.mockito.exceptions.misusing.MissingMethodInvocationException: 
when() requires an argument which has to be 'a method call on a mock'.
For example:
    when(mock.getArticles()).thenReturn(articles);

Also, this error might show up because:
1. you stub either of: final/private/equals()/hashCode() methods.
   Those methods *cannot* be stubbed/verified.
2. inside when() you don't call method on mock but on some other object.

    at com.project.cleaner.controller.test.PcUserControllerTest.shouldGetPcUser(PcUserControllerTest.Java:93)
    at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at Sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at Java.lang.reflect.Method.invoke(Unknown Source)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.Java:44)

Ich habe es mit verschiedenen Methoden versucht, bekomme aber immer diese Fehlermeldung. Ich verwende Spring 3.1.0.RELEASE mit Mockito. Bitte teile und führe mich in die richtige Richtung.

29
jsf

Sie müssen zuerst einen MOCK von pcUserService erstellen und dann diesen Mock verwenden.

PcUserService mock = org.mockito.Mockito.mock(PcUserService.class);
when(mock.read("1")).thenReturn(pcUser);
31
Ralph

Falls andere dieses Problem treffen ...

Es kann auch der Fall sein, dass die Methode, die Sie verspotten möchten, pcUserService.read, als final-Methode deklariert wird. Nach allem, was ich bemerkt habe, scheint dies Probleme mit Mockito zu verursachen.

17
djkelly99

Wenn Sie Kotlin verwenden, sollten Sie wissen, dass die Methoden standardmäßig final sind. Also schreibe open fun anstelle von fun. Danke an @ djkelly99 für einen Tipp.

4
CoolMind

Ich hatte das gleiche Problem, die Methode, die ich verspotten wollte, war eine endgültige Methode. Ich habe den Modifikator entfernt und es hat gut funktioniert.

2
Thomás Preis

Eine andere Lösung für dieses Problem könnte sein, dass Sie im Fall einer Testklasse, die PowerMockRunner verwendet, die Klasse, die Sie verspotten, in der Annotation @PrepareForTest Zur Liste hinzufügen müssen.

Zum Beispiel -

@PrepareForTest({ PcUserService.class })

2
Saran

Es gibt noch einen weiteren Grund für einen solchen Fehler - manchmal zieht es IDE vor, Mockito.when () aus einem anderen Paket statisch zu importieren:

import static io.codearte.catchexception.shade.mockito.Mockito.when;

vs

import static org.mockito.Mockito.when; //should normally use this one

Die Sache ist "wann" aus dem Paket "io.codearte" ist auf Kompilierungsstufe mit org.mockito.Mockito.any () kompatibel, schlägt jedoch während der Laufzeit mit derselben Fehlermeldung fehl.

0