1 package org.mockitointegration; 2 3 import net.bytebuddy.ByteBuddy; 4 import net.bytebuddy.agent.ByteBuddyAgent; 5 import org.hamcrest.Matcher; 6 import org.junit.Assume; 7 import org.junit.Test; 8 import org.mockito.Mockito; 9 import org.mockito.internal.configuration.plugins.Plugins; 10 import org.mockitoutil.ClassLoaders; 11 import org.objenesis.Objenesis; 12 13 import java.util.Arrays; 14 import java.util.Set; 15 16 import static org.mockitoutil.ClassLoaders.coverageTool; 17 18 public class NoJUnitDependenciesTest { 19 20 @Test 21 public void pure_mockito_should_not_depend_JUnit___ByteBuddy() throws Exception { 22 Assume.assumeTrue("ByteBuddyMockMaker".equals(Plugins.getMockMaker().getClass().getSimpleName())); 23 24 ClassLoader classLoader_without_JUnit = ClassLoaders.excludingClassLoader() 25 .withCodeSourceUrlOf( 26 Mockito.class, 27 Matcher.class, 28 ByteBuddy.class, 29 ByteBuddyAgent.class, 30 Objenesis.class 31 ) 32 .withCodeSourceUrlOf(coverageTool()) 33 .without("junit", "org.junit") 34 .build(); 35 36 Set<String> pureMockitoAPIClasses = ClassLoaders.in(classLoader_without_JUnit).omit("runners", "junit", "JUnit").listOwnedClasses(); 37 38 // The later class is required to be initialized before any inline mock maker classes can be loaded. 39 checkDependency(classLoader_without_JUnit, "org.mockito.internal.creation.bytebuddy.InlineByteBuddyMockMaker"); 40 pureMockitoAPIClasses.remove("org.mockito.internal.creation.bytebuddy.InlineByteBuddyMockMaker"); 41 42 for (String pureMockitoAPIClass : pureMockitoAPIClasses) { 43 checkDependency(classLoader_without_JUnit, pureMockitoAPIClass); 44 } 45 } 46 47 private void checkDependency(ClassLoader classLoader_without_JUnit, String pureMockitoAPIClass) throws ClassNotFoundException { 48 try { 49 Class.forName(pureMockitoAPIClass, true, classLoader_without_JUnit); 50 } catch (Throwable e) { 51 e.printStackTrace(); 52 throw new AssertionError(String.format("'%s' has some dependency to JUnit", pureMockitoAPIClass)); 53 } 54 } 55 } 56