| /* |
| * Copyright (c) 2018 Mockito contributors |
| * This program is made available under the terms of the MIT License. |
| */ |
| |
| package org.mockito.internal.invocation.mockref; |
| |
| import java.io.ObjectStreamException; |
| import java.lang.ref.WeakReference; |
| |
| /** |
| * A weak reference that is converted into a strong reference when serialized. |
| * See {@link MockReference}. |
| */ |
| public class MockWeakReference<T> implements MockReference<T> { |
| |
| private final WeakReference<T> ref; |
| |
| public MockWeakReference(T t) { |
| this.ref = new WeakReference<T>(t); |
| } |
| |
| private Object writeReplace() throws ObjectStreamException { |
| return new MockStrongReference<T>(get(), true); |
| } |
| |
| @Override |
| public T get() { |
| T ref = this.ref.get(); |
| |
| if (ref == null) { |
| throw new IllegalStateException("The mock object was garbage collected. " + |
| "This should not happen in normal circumstances when using public API. " + |
| "Typically, the test class keeps strong reference to the mock object " + |
| "and it prevents getting the mock collected. Mockito internally needs " + |
| "to keep weak references to mock objects to avoid memory leaks for " + |
| "certain types of MockMaker implementations. If you see this exception " + |
| "using Mockito public API, please file a bug. For more information see " + |
| "issue #1313."); |
| } |
| |
| return ref; |
| } |
| } |