2016-06-02 32 views
2

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

+1

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

+1

Hmm, ich dachte es zunächst! Danke für den Link. –

Antwort

1

Ich glaube, die problematische Teil ist, dass Sie versuchen, eine static Methode auszuspionieren. I.e. es funktioniert auf nicht-statischen Instanzen:

public class MClass { 

    public String getSysTime() { // this is the tricky one 
     return "salala"; 
    } 
} 

public class MTest { 

    @Test 
    public void testSpying() { 
     MClass m = Mockito.spy(new MClass()); 
     Mockito.when(m.getSysTime()).thenReturn("FakeTimestamp"); 
    } 
} 

In this Q&A sie einige Techniken für den Umgang mit dieser Art von Problem zu erklären.