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