org.powermock.api.mockito.internal.mockcreation.MockTypeValidatorFactory Maven / Gradle / Ivy
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 MockTypeValidator createValidator(Class type, boolean isStatic, boolean isSpy, JavaAgentClassRegister agentClassRegister) {
if (!isStatic || isSpy || isLoadedByBootstrap(type)) {
return new NullMockTypeValidator();
} else if (agentClassRegister == null) {
return new DefaultMockTypeValidator(type);
} else {
return new JavaAgentMockTypeValidator(type, agentClassRegister);
}
}
private static boolean isLoadedByBootstrap(Class type) {
return type.getClassLoader() == null;
}
private static class DefaultMockTypeValidator extends AbstractMockTypeValidator {
DefaultMockTypeValidator(Class type) {
super(type);
}
@Override
public void validate() {
if (!isModifiedByPowerMock()) {
reporter.classNotPrepared(type);
}
}
private boolean isModifiedByPowerMock() {
return PowerMockModified.class.isAssignableFrom(type);
}
}
private static class JavaAgentMockTypeValidator extends AbstractMockTypeValidator {
private final JavaAgentClassRegister agentClassRegister;
private JavaAgentMockTypeValidator(Class 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 implements MockTypeValidator {
final PowerMockReporter reporter;
final Class type;
private AbstractMockTypeValidator(Class type) {
this.type = type;
this.reporter = new MockitoPowerMockReporter();
}
@Override
public abstract void validate();
}
private static class NullMockTypeValidator implements MockTypeValidator {
@Override
public void validate() {
// NUll validator validates nothing
}
}
}