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.expectations.mocking;
6   
7   import edu.umd.cs.findbugs.annotations.NonNull;
8   import edu.umd.cs.findbugs.annotations.Nullable;
9   
10  import mockit.internal.util.StackTrace;
11  
12  import org.objenesis.ObjenesisHelper;
13  
14  /**
15   * Factory for the creation of new mocked instances, and for obtaining/clearing the last instance created. There are
16   * separate subclasses dedicated to mocked interfaces and mocked classes.
17   */
18  public abstract class InstanceFactory {
19  
20      @NonNull
21      private final Class<?> concreteClass;
22      @Nullable
23      Object lastInstance;
24  
25      InstanceFactory(@NonNull Class<?> concreteClass) {
26          this.concreteClass = concreteClass;
27      }
28  
29      @NonNull
30      @SuppressWarnings("unchecked")
31      final <T> T newUninitializedConcreteClassInstance() {
32          try {
33              return (T) ObjenesisHelper.newInstance(concreteClass);
34          } catch (Exception e) {
35              StackTrace.filterStackTrace(e);
36              e.printStackTrace();
37              throw e;
38          }
39      }
40  
41      @NonNull
42      public abstract Object create();
43  
44      @Nullable
45      public final Object getLastInstance() {
46          return lastInstance;
47      }
48  
49      public abstract void clearLastInstance();
50  
51      static final class InterfaceInstanceFactory extends InstanceFactory {
52          @Nullable
53          private Object emptyProxy;
54  
55          InterfaceInstanceFactory(@NonNull Object emptyProxy) {
56              super(emptyProxy.getClass());
57              this.emptyProxy = emptyProxy;
58          }
59  
60          @NonNull
61          @Override
62          public Object create() {
63              if (emptyProxy == null) {
64                  emptyProxy = newUninitializedConcreteClassInstance();
65              }
66  
67              lastInstance = emptyProxy;
68              return emptyProxy;
69          }
70  
71          @Override
72          public void clearLastInstance() {
73              emptyProxy = null;
74              lastInstance = null;
75          }
76      }
77  
78      static final class ClassInstanceFactory extends InstanceFactory {
79          ClassInstanceFactory(@NonNull Class<?> concreteClass) {
80              super(concreteClass);
81          }
82  
83          @Override
84          @NonNull
85          public Object create() {
86              lastInstance = newUninitializedConcreteClassInstance();
87              return lastInstance;
88          }
89  
90          @Override
91          public void clearLastInstance() {
92              lastInstance = null;
93          }
94      }
95  }