All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy