• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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