Mockito NullPointerException bei der Verwendung einer
Ich versuche, mit Mockito wie diese :
Mockito.when(Mockito.any(ObjectMapper.class).readValue(Mockito.any(BufferedReader.class),Mockito.any(Class.class))).thenReturn(new Person("1","abc"));
Dies ist von Jackson-Bibliothek .
public <T> T readValue(Reader src, Class<T> valueType)
Der Grund, warum ich Tue, es ist, weil die Zeit, die ich an dieser Stelle der code es gibt eine Tonne von Objekten, die erstellt wurden. Spott über jeden Schritt Zeit nehmen würden.
Einen Grund, warum ich immer bin, NPE, wenn der code erreicht diese mockito Aussage?
Stack Trace :
java.lang.NullPointerException
at com.prashant.flax.ShellTest.givenDirectoryHasFiles(ShellTest.java:139)
at com.prashant.flax.ShellTest.testExecute(ShellTest.java:61)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.rules.ExternalResource$1.evaluate(ExternalResource.java:48)
at org.junit.rules.RunRules.evaluate(RunRules.java:20)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.junit.runner.JUnitCore.run(JUnitCore.java:160)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:78)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Wie Sie sehen können ist es in einer bestimmten Methode(diese Methode hat nur dieses Stück code) , damit ich sehen kann, beim Debuggen, es reicht über es und stürzt ab.
- hinzufügen stacktrace Ihrer NPE
- Sie haben auf stub auf eine bestimmte mock-Objekt - ich glaube nicht, dass Sie tun können
when(any(T.class)....)
. - Das ist meine Vermutung auch. Aber der compiler nicht beschwert, daher dachte ich, lassen Sie mich Fragen.
- "Compiler nicht meckern" != "mein code ist in Ordnung" ;). Auch Ihre stacktrace nicht um Mockito an alle...
- Danke @OliverCharlesworth . Ja, ich bin nicht sicher, warum gibt es keine mockito, aber doch nicht dort. Zumindest laut intellij(ShellTest.java:139 ist, dass die Linie). Aber trotzdem ist dies nicht der Weg zu gehen. Ich werde einen anderen Weg finden.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Oliver erwähnt in den Kommentaren, die Sie nicht anwenden können
when
zu passieren, um alle Objekte. Mockito funktioniert über das erstellen von Unterklassen so erstellen Sie ein mock-Instanz, die mitmock
,spy
oder eine@Mock
oder@Spy
annotation; anpassen des Verhaltens; und installieren Sie dann die mock mit dependency injection oder ähnliche tricks.Als zu warum dies geschieht, ist der Rückgabewert für
any()
eigentlich istnull
; Matcher wieany
sollen die nur als Argumente verwendet werden, umwhen
undverify
, und Mockito kann nicht produzieren eine spezialisierte InstanzClass
darstellt "jede Klasse", so Mockito gibt einen dummy-Wert (null) und speichert die Daten auf eine spezielle stack-argument-Matcher. Obwohl Mockito hat bessere Fehlermeldungen, um Sie zu warnen, zu dieser situation, Ihren code NPEs vor Mockito kann Ihnen eine richtige Ausnahme mit Anwendungsbeispielen.Mehr über matcher und Rückgabewerte auf dem stack, siehe meine andere Antwort SO auf "Wie Mockito Matcher zu arbeiten?".