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 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  }