2016-04-14 11 views
1

Ich experimentiere mit der Umwandlung eines meiner Projekte in Groovy und möchte weiter mit JUnit4 mit Mockito. Ich habe einen Test, der bestätigt, dass ein Spring AOP um Ratschläge aufgerufen wird, wenn ich eine andere Methode anrufe.Mockito Matchers in Groovy

Hier ist mein Code:

@Test 
    void testPointCut() { 
    //Given 
    def target = new MainController(); 
    def factory = new AspectJProxyFactory(target); 
    def aspect = mock(LoggingAspect.class); 
    factory.addAspect(aspect); 
    def proxy = factory.getProxy(); 
    when(aspect.log(any(ProceedingJoinPoint))).thenReturn(null); 

    //When 
    proxy.index(); 

    //Then 
    verify(aspect).log(any(ProceedingJoinPoint)); 
    } 

Als ich das laufen, ich eine Ausnahme erhalten:

testPointCut(com.meetupinthemiddle.LoggingAspectTest) Time elapsed: 0.277 sec <<< ERROR! 
org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 
Invalid use of argument matchers! 
0 matchers expected, 1 recorded: 
-> at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallStatic(CallSiteArray.java:56) 

This exception may occur if matchers are combined with raw values: 
    //incorrect: 
    someMethod(anyObject(), "raw String"); 
When using matchers, all arguments have to be provided by matchers. 
For example: 
    //correct: 
    someMethod(anyObject(), eq("String by matcher")); 

For more info see javadoc for Matchers class. 

     at org.codehaus.groovy.runtime.callsite.CallSiteArray.createPogoSite(CallSiteArray.java:147) 
     at org.codehaus.groovy.runtime.callsite.CallSiteArray.createCallSite(CallSiteArray.java:164) 
     at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48) 
     at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113) 
     at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125) 
     at com.meetupinthemiddle.LoggingAspectTest.testPointCut(LoggingAspectTest.groovy:20) 

Aber der entsprechende Code in Java arbeitet ohne problem- Irgendwelche Ideen? Ich denke, das Problem könnte das gleiche wie das? Bug in Mockito with Grails/Groovy, aber es hat keine Antwort!

Antwort

6

Ich glaube, Mockito hat Schwierigkeiten, konkrete groovige Klassen zu verspotten. Ich bekomme die gleiche Art von Fehler, wenn ich eine einfache konkrete Klassen mock, aber wenn ich eine Schnittstelle hinzufügen und die Schnittstelle vortäuschen, dann funktioniert es.

Ich denke (wie in der Antwort auf die Frage, die Sie verknüpft) festgestellt, dass groovy den Aufruf abfängt und ersetzt es einen Aufruf von GetMetaClass().

Möglicher Beweis dafür ist, dass der Fehler sagt "0 Matcher erwartet", wenn Sie eindeutig Übereinstimmungen für Ihre Methode haben.