use of org.mockito.internal.invocation.realmethod.CleanTraceRealMethod in project mockito by mockito.
the class CleanTraceRealMethodTest method shouldRemoveMockitoInternalsFromStackTraceWhenRealMethodThrows.
@Test
public void shouldRemoveMockitoInternalsFromStackTraceWhenRealMethodThrows() throws Throwable {
//given
CleanTraceRealMethod realMethod = new CleanTraceRealMethod(new RealMethod() {
public Object invoke(Object target, Object[] arguments) throws Throwable {
return new Foo().throwSomething();
}
});
//when
try {
realMethod.invoke(null, null);
fail();
//then
} catch (Exception e) {
Assertions.assertThat(e).has(methodInStackTraceAt(0, "throwSomething"));
Assertions.assertThat(e).has(methodInStackTraceAt(1, "invoke"));
Assertions.assertThat(e).has(methodInStackTraceAt(2, "shouldRemoveMockitoInternalsFromStackTraceWhenRealMethodThrows"));
}
}
use of org.mockito.internal.invocation.realmethod.CleanTraceRealMethod in project powermock by powermock.
the class MethodInterceptorFilter method intercept.
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
if (isEqualsMethod(method)) {
return proxy == args[0];
} else if (isHashCodeMethod(method)) {
return hashCodeForMock(proxy);
} else if (acrossJVMSerializationFeature.isWriteReplace(method)) {
return acrossJVMSerializationFeature.writeReplace(proxy);
}
MockitoMethodProxy mockitoMethodProxy = createMockitoMethodProxy(methodProxy);
new CGLIBHacker().setMockitoNamingPolicy(methodProxy);
MockitoMethod mockitoMethod = createMockitoMethod(method);
CleanTraceRealMethod realMethod = new CleanTraceRealMethod(mockitoMethodProxy);
Invocation invocation = new InvocationImpl(proxy, mockitoMethod, args, SequenceNumber.next(), realMethod, new LocationImpl());
return handler.handle(invocation);
}
use of org.mockito.internal.invocation.realmethod.CleanTraceRealMethod in project powermock by powermock.
the class MockitoMethodInvocationControl method performIntercept.
private Object performIntercept(MethodInterceptorFilter invocationHandler, final Object interceptionObject, final Method method, Object[] arguments) throws Throwable {
MockHandler mockHandler = invocationHandler.getHandler();
final CleanTraceRealMethod cglibProxyRealMethod = new CleanTraceRealMethod(new RealMethod() {
private static final long serialVersionUID = 4564320968038564170L;
@Override
public Object invoke(Object target, Object[] arguments) throws Throwable {
/*
* Instruct the MockGateway to don't intercept the next call.
* The reason is that when Mockito is spying on objects it
* should call the "real method" (which is proxied by Mockito
* anyways) so that we don't end up in here one more time which
* causes infinite recursion. This should not be done if the
* interceptionObject is a final system class because these are
* never caught by the Mockito proxy.
*/
final Class<?> type = Whitebox.getType(interceptionObject);
final boolean isFinalSystemClass = type.getName().startsWith("java.") && Modifier.isFinal(type.getModifiers());
if (!isFinalSystemClass) {
MockRepository.putAdditionalState(MockGateway.DONT_MOCK_NEXT_CALL, true);
}
try {
return method.invoke(target, arguments);
} catch (InvocationTargetException e) {
SafeExceptionRethrower.safeRethrow(e.getCause());
}
return null;
}
});
Invocation invocation = new InvocationImpl(interceptionObject, new DelegatingMethod(method), arguments, SequenceNumber.next(), cglibProxyRealMethod, new LocationImpl()) {
private static final long serialVersionUID = -3679957412502758558L;
@Override
public String toString() {
return new ToStringGenerator().generate(getMock(), getMethod(), getArguments());
}
};
try {
return replaceMatchersBinderIfNeeded(mockHandler).handle(invocation);
} catch (NotAMockException e) {
if (invocation.getMock().getClass().getName().startsWith("java.") && MockRepository.getInstanceMethodInvocationControl(invocation.getMock()) != null) {
return invocation.callRealMethod();
} else {
throw e;
}
} catch (MockitoAssertionError e) {
InvocationControlAssertionError.updateErrorMessageForMethodInvocation(e);
throw e;
}
}
Aggregations