package org.powermock.api.mockito.internal.mockcreation;
import org.powermock.api.mockito.expectation.reporter.MockitoPowerMockReporter;
import org.powermock.core.agent.JavaAgentClassRegister;
import org.powermock.core.classloader.PowerMockModified;
import org.powermock.core.reporter.PowerMockReporter;
/**
*
*/
public class MockTypeValidatorFactory {
public static <T> MockTypeValidator<T> createValidator(Class<T> type, boolean isStatic, boolean isSpy, JavaAgentClassRegister agentClassRegister) {
if (!isStatic || isSpy || isLoadedByBootstrap(type)) {
return new NullMockTypeValidator<T>();
} else if (agentClassRegister == null) {
return new DefaultMockTypeValidator<T>(type);
} else {
return new JavaAgentMockTypeValidator<T>(type, agentClassRegister);
}
}
private static boolean isLoadedByBootstrap(Class type) {
return type.getClassLoader() == null;
}
private static class DefaultMockTypeValidator<T> extends AbstractMockTypeValidator<T> {
DefaultMockTypeValidator(Class<T> type) {
super(type);
}
@Override
public void validate() {
if (!isModifiedByPowerMock()) {
reporter.classNotPrepared(type);
}
}
private boolean isModifiedByPowerMock() {
return PowerMockModified.class.isAssignableFrom(type);
}
}
private static class JavaAgentMockTypeValidator<T> extends AbstractMockTypeValidator<T> {
private final JavaAgentClassRegister agentClassRegister;
private JavaAgentMockTypeValidator(Class<T> type,
JavaAgentClassRegister agentClassRegister) {
super(type);
this.agentClassRegister = agentClassRegister;
}
@Override
public void validate() {
if (!isModifiedByAgent()) {
reporter.classNotPrepared(type);
}
}
private boolean isModifiedByAgent() {
return agentClassRegister.isModifiedByAgent(type.getClassLoader(), type.getName());
}
}
private abstract static class AbstractMockTypeValidator<T> implements MockTypeValidator<T> {
final PowerMockReporter reporter;
final Class<T> type;
private AbstractMockTypeValidator(Class<T> type) {
this.type = type;
this.reporter = new MockitoPowerMockReporter();
}
@Override
public abstract void validate();
}
private static class NullMockTypeValidator<T> implements MockTypeValidator<T> {
@Override
public void validate() {
// NUll validator validates nothing
}
}
}