1
2
3
4
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 }