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 java.lang.annotation.Annotation;
12 import java.util.List;
13
14 import mockit.Tested;
15 import mockit.internal.state.TestRun;
16 import mockit.internal.util.TestMethod;
17
18 import org.checkerframework.checker.index.qual.NonNegative;
19
20 public final class TestedParameters {
21 @NonNull
22 private final TestMethod testMethod;
23 @NonNull
24 private final InjectionState injectionState;
25
26 public TestedParameters(@NonNull TestMethod testMethod) {
27 this.testMethod = testMethod;
28
29 TestedClassInstantiations testedClasses = TestRun.getTestedClassInstantiations();
30 injectionState = testedClasses == null ? new InjectionState() : testedClasses.injectionState;
31 }
32
33 public void createTestedParameters(@NonNull Object testClassInstance,
34 @NonNull List<? extends InjectionProvider> injectables) {
35 injectionState.addInjectables(testClassInstance, injectables);
36
37 for (int n = testMethod.getParameterCount(), i = 0; i < n; i++) {
38 TestedParameter testedParameter = createTestedParameterIfApplicable(i);
39
40 if (testedParameter != null) {
41 instantiateTestedObject(testClassInstance, testedParameter);
42 }
43 }
44 }
45
46 @Nullable
47 private TestedParameter createTestedParameterIfApplicable(@NonNegative int parameterIndex) {
48 Annotation[] parameterAnnotations = testMethod.getParameterAnnotations(parameterIndex);
49
50 for (Annotation parameterAnnotation : parameterAnnotations) {
51 Tested testedMetadata = TestedObject.getTestedAnnotationIfPresent(parameterAnnotation);
52
53 if (testedMetadata != null) {
54 return new TestedParameter(injectionState, testMethod, parameterIndex, testedMetadata);
55 }
56 }
57
58 return null;
59 }
60
61 private void instantiateTestedObject(@NonNull Object testClassInstance, @NonNull TestedParameter testedObject) {
62 try {
63 testedObject.instantiateWithInjectableValues(testClassInstance);
64 } finally {
65 injectionState.injectionProviders.resetConsumedInjectionProviders();
66 }
67 }
68 }