您可以通过创建自定义MockMaker
.
MockMaker 是一个扩展点,可以使用自定义动态代理并避免使用默认的 cglib/asm/objenesis 实现
我们的自定义实现将所有复杂的东西委托给默认的MockMaker
: CglibMockMaker
。它通过在参数 an上注册仅“装饰”该createMock
方法。当一个已经完成允许使用调用和时,将通知此侦听器。settings
InvocationListener
invocation
validateArguments
validateReturnValue
import org.mockito.internal.creation.CglibMockMaker;
import org.mockito.invocation.Invocation;
import org.mockito.invocation.MockHandler;
import org.mockito.listeners.InvocationListener;
import org.mockito.listeners.MethodInvocationReport;
import org.mockito.mock.MockCreationSettings;
import org.mockito.plugins.MockMaker;
public class ValidationMockMaker implements MockMaker {
private final MockMaker delegate = new CglibMockMaker();
public ValidationMockMaker() {
}
@Override
public <T> T createMock(MockCreationSettings<T> settings, MockHandler handler) {
settings.getInvocationListeners().add(new InvocationListener() {
@Override
public void reportInvocation(MethodInvocationReport methodInvocationReport) {
Invocation invocation = (Invocation) methodInvocationReport.getInvocation();
validateArguments(invocation.getArguments());
validateReturnValue(methodInvocationReport.getReturnedValue());
}
});
return delegate.createMock(settings, handler);
}
@Override
public MockHandler getHandler(Object mock) {
return delegate.getHandler(mock);
}
@Override
public void resetMock(Object mock, MockHandler newHandler, MockCreationSettings settings) {
delegate.resetMock(mock, newHandler, settings);
}
protected void validateArguments(Object... arguments) {
// Arrays.stream(arguments).forEach(Objects::requireNonNull);
}
private void validateReturnValue(Object result) {
// Objects.requireNonNull(result);
}
}
最后但同样重要的是,我们需要告诉 Mockito 使用我们的实现。这可以通过添加文件来实现
mockito-extensions/org.mockito.plugins.MockMaker
包含我们的 MockMaker 类名:
ValidationMockMaker
请参阅Using the extension point
javadoc 中的部分。