1/*
2 * Copyright (c) 2007 Mockito contributors
3 * This program is made available under the terms of the MIT License.
4 */
5package org.mockito.internal.configuration;
6
7import net.bytebuddy.ByteBuddy;
8import org.assertj.core.api.Assertions;
9import org.junit.After;
10import org.junit.Test;
11import org.mockito.Mockito;
12import org.mockito.configuration.AnnotationEngine;
13import org.mockito.internal.configuration.plugins.Plugins;
14import org.mockitoutil.ClassLoaders;
15import org.objenesis.Objenesis;
16
17import static org.assertj.core.api.Assertions.assertThat;
18
19public class GlobalConfigurationTest {
20    @Test
21    public void returns_mockito_configuration_annotation_engine_if_non_default() throws Exception {
22        ConfigurationAccess.getConfig().overrideAnnotationEngine(new CustomAnnotationEngine());
23        assertThat(new GlobalConfiguration().getAnnotationEngine()).isInstanceOf(CustomAnnotationEngine.class);
24        assertThat(new GlobalConfiguration().tryGetPluginAnnotationEngine()).isInstanceOf(CustomAnnotationEngine.class);
25    }
26
27    @Test
28    public void returns_mockito_annotation_engine_of_Plugins_if_no_MockitoConfiguration() throws Throwable {
29        ClassLoader anotherWorld = ClassLoaders.isolatedClassLoader()
30                .withCurrentCodeSourceUrls()
31                .withCodeSourceUrlOf(Mockito.class, ByteBuddy.class, Objenesis.class)
32                .withPrivateCopyOf("org.mockito", "net.bytebuddy", "org.objenesis")
33                .withCodeSourceUrlOf(Assertions.class)
34                .withPrivateCopyOf("org.assertj")
35                .without("org.mockito.configuration.MockitoConfiguration")
36                .build();
37
38        ClassLoaders.using(anotherWorld).execute(new Runnable() {
39            @Override
40            public void run() {
41                assertThat(new GlobalConfiguration().getAnnotationEngine()).isInstanceOf(Plugins.getAnnotationEngine().getClass());
42                assertThat(new GlobalConfiguration().tryGetPluginAnnotationEngine()).isInstanceOf(Plugins.getAnnotationEngine().getClass());
43            }
44        });
45    }
46
47    @After
48    public void reset_annotation_engine() {
49        ConfigurationAccess.getConfig().overrideAnnotationEngine(null);
50    }
51
52    private static class CustomAnnotationEngine implements AnnotationEngine {
53        @Override public void process(Class<?> clazz, Object testInstance) { }
54    }
55}
56