2016-04-14 7 views
1

私のプロジェクトをGroovyに変換することを実験しており、MockitoでJUnit4を使用したいと考えています。私は、別のメソッドを呼び出すと、春のAop around adviceが呼び出されることを検証するテストがあります。GroovyのMockito Matchers

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) 

しかし、Javaで同等のコードは、任意のアイデアなしproblem-で動作します:

@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)); 
    } 

私はこれを実行して、私は例外を取得:ここ

は私のコードですか? 問題はこれと同じかもしれないと思いますか? Bug in Mockito with Grails/Groovyしかし答えはありません!

答えて

6

私はMockitoがコンクリートのグルーヴィークラスを模擬するのに問題があると信じています。私はシンプルな具体的なクラスを模擬するときに同じタイプのエラーが発生しますが、インターフェイスを追加してインターフェイスをモックすると、動作します。

groovyが呼び出しを傍受して置き換え、getMetaClass()を呼び出すと思います。

可能性のある証拠は、あなたのメソッドにマッチしたことが明らかになったときにエラー "0 matchers expected"と表示されることです。