1 /* 2 * Copyright (c) 2019 Mockito contributors 3 * This program is made available under the terms of the MIT License. 4 */ 5 package org.mockitointegration; 6 7 import static org.mockitoutil.ClassLoaders.coverageTool; 8 9 import java.util.Set; 10 11 import org.hamcrest.Matcher; 12 import org.junit.*; 13 import org.mockito.Mockito; 14 import org.mockitoutil.ClassLoaders; 15 16 public class NoByteCodeDependenciesTest { 17 18 private ClassLoader contextClassLoader; 19 20 @Test pure_mockito_should_not_depend_bytecode_libraries()21 public void pure_mockito_should_not_depend_bytecode_libraries() throws Exception { 22 23 ClassLoader classLoader_without_bytecode_libraries = 24 ClassLoaders.excludingClassLoader() 25 .withCodeSourceUrlOf(Mockito.class, Matcher.class) 26 .withCodeSourceUrlOf(coverageTool()) 27 .without("net.bytebuddy", "org.objenesis") 28 .build(); 29 30 Set<String> pureMockitoAPIClasses = 31 ClassLoaders.in(classLoader_without_bytecode_libraries) 32 .omit("bytebuddy", "runners", "junit", "JUnit", "opentest4j") 33 .listOwnedClasses(); 34 pureMockitoAPIClasses.remove( 35 "org.mockito.internal.creation.instance.DefaultInstantiatorProvider"); 36 pureMockitoAPIClasses.remove( 37 "org.mockito.internal.creation.instance.ObjenesisInstantiator"); 38 39 // Remove classes that trigger plugin-loading, since bytebuddy plugins are the default. 40 pureMockitoAPIClasses.remove("org.mockito.internal.debugging.LocationImpl"); 41 pureMockitoAPIClasses.remove("org.mockito.internal.exceptions.stacktrace.StackTraceFilter"); 42 pureMockitoAPIClasses.remove("org.mockito.internal.util.MockUtil"); 43 44 // Remove instrumentation-based member accessor which is optional. 45 pureMockitoAPIClasses.remove( 46 "org.mockito.internal.util.reflection.InstrumentationMemberAccessor"); 47 48 for (String pureMockitoAPIClass : pureMockitoAPIClasses) { 49 checkDependency(classLoader_without_bytecode_libraries, pureMockitoAPIClass); 50 } 51 } 52 checkDependency(ClassLoader classLoader, String pureMockitoAPIClass)53 private void checkDependency(ClassLoader classLoader, String pureMockitoAPIClass) 54 throws ClassNotFoundException { 55 try { 56 Class.forName(pureMockitoAPIClass, true, classLoader); 57 } catch (Throwable e) { 58 e.printStackTrace(); 59 throw new AssertionError( 60 String.format( 61 "'%s' has some dependency to Byte Buddy or Objenesis", 62 pureMockitoAPIClass)); 63 } 64 } 65 } 66