Groovy 中的 Mockito 匹配器
Mockito Matchers in Groovy
我正在尝试将我的一个项目转换为 groovy 并希望继续将 JUnit4 与 Mockito 结合使用。我有一个测试可以验证当我调用不同的方法时 spring aop around advice 被调用。
这是我的代码:
@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 但它没有答案!
我相信 Mockito 在模拟具体 groovy 类 时遇到了麻烦。当我模拟一个简单的具体 类 时,我得到了相同类型的错误,但是当我添加一个接口并模拟该接口时,它就可以工作了。
我认为(如您链接到的问题的答案所述)groovy 正在拦截调用并将调用 getMetaClass() 替换它。
可能的证据是,当您的方法明显有匹配项时,错误会显示“预期有 0 个匹配项”。
我正在尝试将我的一个项目转换为 groovy 并希望继续将 JUnit4 与 Mockito 结合使用。我有一个测试可以验证当我调用不同的方法时 spring aop around advice 被调用。
这是我的代码:
@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 但它没有答案!
我相信 Mockito 在模拟具体 groovy 类 时遇到了麻烦。当我模拟一个简单的具体 类 时,我得到了相同类型的错误,但是当我添加一个接口并模拟该接口时,它就可以工作了。
我认为(如您链接到的问题的答案所述)groovy 正在拦截调用并将调用 getMetaClass() 替换它。
可能的证据是,当您的方法明显有匹配项时,错误会显示“预期有 0 个匹配项”。