View Javadoc
1   /*
2    * Copyright (c) 2006 JMockit developers
3    * This file is subject to the terms of the MIT license (see LICENSE.txt).
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  }