以下に示す unittest クラスでは、テストの 1 つが失敗し、もう 1 つが成功します。どちらのテストもCGLIB
、インターセプター モックを使用してオブジェクトを作成し、インターセプターが相互作用することを確認しようとします。テストは、CGLIB で動的にサブクラス化されるクラスによって異なります。成功するテストは、プレーンな Java インターフェースをサブクラス化します。失敗したものは、動的サブクラス (で作成Mockito
) をサブクラス化します。最初のテストが失敗するのはなぜですか?
ありがとう。
public class ATest {
@Test
// This test fails.
public void cannotCallMethodOnMockWrapper() throws Throwable {
final Class<? extends Bar> c = Mockito.mock(Bar.class).getClass();
verifyInterceptorIsInvokedOnCallToObjectOfEnhanced(c);
}
@Test
// This test succeeds.
public void interceptorIsCalled() throws Throwable {
final Class<? extends Bar> c = Bar.class;
verifyInterceptorIsInvokedOnCallToObjectOfEnhanced(c);
}
private void verifyInterceptorIsInvokedOnCallToObjectOfEnhanced(
final Class<? extends Bar> c) throws Throwable {
final MethodInterceptor interceptor = Mockito.mock(
MethodInterceptor.class);
final Bar wrapper = (Bar) Enhancer.create(c, interceptor);
// Here is where the failing test chokes with exception:
// NoSuchMethodError
wrapper.foo();
verifyInterceptIsCalledOn(interceptor);
}
private void verifyInterceptIsCalledOn(
final MethodInterceptor interceptor) throws Throwable {
verify(interceptor).intercept(any(), any(Method.class),
any(Object[].class), any(MethodProxy.class));
}
public static interface Bar {
void foo();
}
}
アップデート:
障害のスタック トレース
java.lang.NoSuchMethodError: java.lang.Object.foo()V
at ATest$Bar$$EnhancerByMockitoWithCGLIB$$2e1d601f.foo(<generated>)
at ATest.verifyInterceptorIsInvokedOnCallToObjectOfEnhanced(ATest.java:37)
at ATest.cannotCallMethodOnMockWrapper(ATest.java:19)
また、Mockito モックが CGLIB 拡張クラスであるかどうかについては、以下のテスト (失敗) はそうではないことを示唆しているようです。
public class ATest {
@Test
public void mockitoMockIsCGLIBEnhanced() {
assertTrue(Enhancer.isEnhanced(Mockito.mock(Bar.class).getClass()));
}
public static interface Bar {
void foo();
}
}