如果我在运行时包装由 Mockito 创建的模拟,然后在包装器上调用一个方法,则不会调用包装的模拟。请看下面:
这是我运行的测试:
import static org.mockito.Mockito.verify;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.NoOp;
import org.junit.Test;
import org.mockito.Mockito;
public class MyTest {
@Test
public void mockIsCalled() {
final Bar bar = Mockito.mock(Bar.class);
final Bar wrapper = wrap(bar);
wrapper.foo();
verify(bar).foo();
}
@SuppressWarnings("unchecked")
private <T> T wrap(final T objToWrap) {
return (T) Enhancer.create(objToWrap.getClass(), NoOp.INSTANCE);
}
}
其中 Bar 是:
public interface Bar {
String foo();
}
测试失败,我得到的输出是:
java.lang.NoSuchMethodError: java.lang.Object.foo()Ljava/lang/String;
at Bar$$EnhancerByMockitoWithCGLIB$$d2b59df8.foo(<generated>)
at MyTest.mockIsCalled(MyTest.java:18)
...
如果我将 Bar 变成一个类,如下所示:
public class Bar {
public String foo() {
System.out.println("foo");
return null;
}
}
测试继续失败,foo
打印在控制台上,我得到输出:
Wanted but not invoked:
bar.foo();
-> at MyTest.mockIsCalled(MyTest.java:20)
Actually, there were zero interactions with this mock.
at MyTest.mockIsCalled(MyTest.java:20)
...
我很困惑。
我要解决的真正问题是包装动态代理(由 Mule 通过组件绑定注入),以便记住对包装的动态代理的方法调用。我想让它足够通用,这样就足以包装动态代理对象而无需扩展任何接口。
谢谢