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