View Javadoc
1   /*
2    * Copyright (c) 2006 JMockit developers
3    * This file is subject to the terms of the MIT license (see LICENSE.txt).
4    */
5   package mockit.internal.injection;
6   
7   import edu.umd.cs.findbugs.annotations.NonNull;
8   import edu.umd.cs.findbugs.annotations.Nullable;
9   
10  import mockit.internal.injection.InjectionPoint.KindOfInjectionPoint;
11  import mockit.internal.injection.field.FieldInjection;
12  import mockit.internal.injection.full.FullInjection;
13  
14  public final class BeanExporter {
15      @NonNull
16      private final InjectionState injectionState;
17  
18      BeanExporter(@NonNull InjectionState injectionState) {
19          this.injectionState = injectionState;
20      }
21  
22      @Nullable
23      public Object getBean(@NonNull String name) {
24          InjectionPoint injectionPoint = new InjectionPoint(Object.class, name, true);
25          return injectionState.getInstantiatedDependency(null, injectionPoint);
26      }
27  
28      @Nullable
29      public <T> T getBean(@NonNull Class<T> beanType) {
30          TestedClass testedClass = new TestedClass(beanType, beanType);
31          String beanName = getBeanNameFromType(beanType);
32  
33          injectionState.injectionProviders.setTypeOfInjectionPoint(beanType, KindOfInjectionPoint.NotAnnotated);
34          InjectionProvider injectable = injectionState.injectionProviders.findInjectableByTypeAndName(beanName,
35                  testedClass);
36  
37          if (injectable != null) {
38              Object testInstance = injectionState.getCurrentTestClassInstance();
39              return (T) injectable.getValue(testInstance);
40          }
41  
42          FullInjection injection = new FullInjection(injectionState, beanType, beanName);
43          Injector injector = new FieldInjection(injectionState, injection);
44  
45          return (T) injection.createOrReuseInstance(testedClass, injector, null, beanName);
46      }
47  
48      @NonNull
49      private static String getBeanNameFromType(@NonNull Class<?> beanType) {
50          String name = beanType.getSimpleName();
51          return Character.toLowerCase(name.charAt(0)) + name.substring(1);
52      }
53  }