package org.mockitointegration; import net.bytebuddy.ByteBuddy; import net.bytebuddy.agent.ByteBuddyAgent; import org.hamcrest.Matcher; import org.junit.Assume; import org.junit.Test; import org.mockito.Mockito; import org.mockito.internal.configuration.plugins.Plugins; import org.mockitoutil.ClassLoaders; import org.objenesis.Objenesis; import java.util.Arrays; import java.util.Set; import static org.mockitoutil.ClassLoaders.coverageTool; public class NoJUnitDependenciesTest { @Test public void pure_mockito_should_not_depend_JUnit___ByteBuddy() throws Exception { Assume.assumeTrue("ByteBuddyMockMaker".equals(Plugins.getMockMaker().getClass().getSimpleName())); ClassLoader classLoader_without_JUnit = ClassLoaders.excludingClassLoader() .withCodeSourceUrlOf( Mockito.class, Matcher.class, ByteBuddy.class, ByteBuddyAgent.class, Objenesis.class ) .withCodeSourceUrlOf(coverageTool()) .without("junit", "org.junit") .build(); Set<String> pureMockitoAPIClasses = ClassLoaders.in(classLoader_without_JUnit).omit("runners", "junit", "JUnit").listOwnedClasses(); // The later class is required to be initialized before any inline mock maker classes can be loaded. checkDependency(classLoader_without_JUnit, "org.mockito.internal.creation.bytebuddy.InlineByteBuddyMockMaker"); pureMockitoAPIClasses.remove("org.mockito.internal.creation.bytebuddy.InlineByteBuddyMockMaker"); for (String pureMockitoAPIClass : pureMockitoAPIClasses) { checkDependency(classLoader_without_JUnit, pureMockitoAPIClass); } } private void checkDependency(ClassLoader classLoader_without_JUnit, String pureMockitoAPIClass) throws ClassNotFoundException { try { Class.forName(pureMockitoAPIClass, true, classLoader_without_JUnit); } catch (Throwable e) { e.printStackTrace(); throw new AssertionError(String.format("'%s' has some dependency to JUnit", pureMockitoAPIClass)); } } }