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