Groovy中的Mockito Matchers

时间:2016-04-14 14:29:55

标签: groovy mockito aop spy

我正在尝试将我的项目转换为groovy,并希望继续使用JUnit4和Mockito。我有一个测试,当我调用不同的方法时,它会验证是否会调用一个spring aop。

这是我的代码:

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

当我运行时,我得到一个例外:

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中的等效代码没有任何问题 - 任何想法? 我认为问题可能与此相同? Bug in Mockito with Grails/Groovy但它没有答案!

1 个答案:

答案 0 :(得分:7)

我相信Mockito很难嘲笑具体的常规课程。当我模拟一个简单的具体类时,我得到了相同类型的错误,但是当我添加一个接口并模拟接口时,它就可以工作。

我认为(如你所链接问题的答案所述)groovy正在拦截调用并替换它将调用getMetaClass()。

可能的证据是,该错误表示&#34; 0匹配预期&#34;当你的方法明显匹配时。