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.integration.springframework;
7   
8   import edu.umd.cs.findbugs.annotations.NonNull;
9   import edu.umd.cs.findbugs.annotations.Nullable;
10  
11  import mockit.Injectable;
12  import mockit.Invocation;
13  import mockit.Mock;
14  import mockit.MockUp;
15  import mockit.Tested;
16  import mockit.internal.injection.BeanExporter;
17  import mockit.internal.injection.TestedClassInstantiations;
18  import mockit.internal.state.TestRun;
19  
20  import org.springframework.beans.factory.support.AbstractBeanFactory;
21  import org.springframework.beans.factory.support.DefaultListableBeanFactory;
22  
23  /**
24   * If applied, this fake will take over calls to {@link AbstractBeanFactory#getBean(String)} and
25   * {@link AbstractBeanFactory#getBean(String, Class)} in any implementation class, returning instead a
26   * {@link Tested @Tested} or {@link Injectable @Injectable} object with the given field name, or a dependency object
27   * injected at any level into a <code>@Tested</code> object.
28   * <p>
29   * In case said calls come (indirectly) from a test class having no <code>@Tested</code> fields, bean lookup will
30   * proceed into the actual <code>getBean</code> implementation method.
31   * <p>
32   * Note this fake is only useful if the code under test makes direct calls to Spring's <code>getBean</code> methods.
33   */
34  public final class FakeBeanFactory extends MockUp<DefaultListableBeanFactory> {
35      @Mock
36      public static Object getBean(@NonNull Invocation invocation, @NonNull String name) {
37          TestedClassInstantiations testedClasses = TestRun.getTestedClassInstantiations();
38  
39          if (testedClasses == null) {
40              return invocation.proceed();
41          }
42  
43          BeanExporter beanExporter = testedClasses.getBeanExporter();
44          return BeanLookup.getBean(beanExporter, name);
45      }
46  
47      @Mock
48      public static <T> T getBean(@NonNull Invocation invocation, @NonNull String name, @Nullable Class<T> requiredType) {
49          TestedClassInstantiations testedClasses = TestRun.getTestedClassInstantiations();
50  
51          if (testedClasses == null) {
52              return invocation.proceed();
53          }
54  
55          BeanExporter beanExporter = testedClasses.getBeanExporter();
56          return BeanLookup.getBean(beanExporter, name, requiredType);
57      }
58  
59      @Mock
60      public static <T> T getBean(@NonNull Invocation invocation, @NonNull Class<T> requiredType) {
61          TestedClassInstantiations testedClasses = TestRun.getTestedClassInstantiations();
62  
63          if (testedClasses == null) {
64              return invocation.proceed();
65          }
66  
67          BeanExporter beanExporter = testedClasses.getBeanExporter();
68          return BeanLookup.getBean(beanExporter, requiredType);
69      }
70  }