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