Ich habe eine public class MClass
, die eine public static
Methode getSysTime()
enthält. In meinem Test versuche ich nur diese eine bestimmte Methode der Klasse zu verspotten. Ich brauche grundsätzlich, dass, wenn diese Methode dieser Klasse im Test aufgerufen wird, eine Zeichenfolge "FakeTimestamp" zurückgibt. Die Klasse MClass
hat keine Elternklasse. Im Anschluss ist mein Code:Mockitos Spionagefunktion schlägt fehl
MClass m = Mockito.spy(new MClass());
Mockito.when(m.getSysTime()).thenReturn("FakeTimestamp");
Allerdings bekomme ich folgende Fehler auf Test:
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.
3. the parent of the mocked class is not public.
It is a limitation of the mock engine.
at com.scb.edmhdpif.filevalidator.CDCRowCountValidatorTest.CDCRowCountFileDriverTest(CDCRowCountValidatorTest.java:77)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
at org.junit.runner.JUnitCore.run(JUnitCore.java:157)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:234)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:74)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
Process finished with exit code -1
Ich benutze IntelliJ Idea 15.0.2. Gibt es eine Möglichkeit, dass ich diesen Fehler beheben kann oder gibt es noch eine andere Engine, die mir dabei helfen kann, das zu erreichen, was ich brauche?
Mit freundlichen Grüßen
Mockito kann statische Methoden nicht vortäuschen. Verwenden Sie PowerMockito darüber. Siehe [diese Frage] (http://stackoverflow.com/questions/21105403/mocking-static-methods-with-mockito) – troig
Hmm, ich dachte es zunächst! Danke für den Link. –