diff --git a/src/main/java/org/springframework/data/gemfire/support/GemfireBeanFactoryLocator.java b/src/main/java/org/springframework/data/gemfire/support/GemfireBeanFactoryLocator.java index 4836041b..8286c6cb 100644 --- a/src/main/java/org/springframework/data/gemfire/support/GemfireBeanFactoryLocator.java +++ b/src/main/java/org/springframework/data/gemfire/support/GemfireBeanFactoryLocator.java @@ -57,7 +57,7 @@ import org.springframework.util.StringUtils; @SuppressWarnings("all") public class GemfireBeanFactoryLocator implements BeanFactoryAware, BeanNameAware, DisposableBean, InitializingBean { - // bean alias/name <-> BeanFactory mapping + // Bean alias/name <-> BeanFactory mapping protected static final ConcurrentMap BEAN_FACTORIES = new ConcurrentHashMap<>(); private BeanFactory beanFactory; @@ -68,6 +68,13 @@ public class GemfireBeanFactoryLocator implements BeanFactoryAware, BeanNameAwar private String associatedBeanName; + /** + * Cleans up all {@link BeanFactory} references tracked by this locator. + */ + public static void clear() { + BEAN_FACTORIES.clear(); + } + /** * Factory method to construct a new, initialized instance of {@link GemfireBeanFactoryLocator}. * @@ -164,8 +171,8 @@ public class GemfireBeanFactoryLocator implements BeanFactoryAware, BeanNameAwar } } - Assert.state(allTheSameBeanFactory, String.format( - "BeanFactory key must be specified when more than one BeanFactory %s is registered", + Assert.state(allTheSameBeanFactory, + String.format("BeanFactory key must be specified when more than one BeanFactory %s is registered", new TreeSet(BEAN_FACTORIES.keySet()).toString())); return BEAN_FACTORIES.values().iterator().next(); @@ -187,10 +194,12 @@ public class GemfireBeanFactoryLocator implements BeanFactoryAware, BeanNameAwar */ protected static synchronized void registerAliases(Set names, BeanFactory beanFactory) { - Assert.isTrue(nullSafeSet(names).isEmpty() || beanFactory != null, + Set safeNames = nullSafeSet(names); + + Assert.isTrue(safeNames.isEmpty() || beanFactory != null, "BeanFactory must not be null when aliases are specified"); - for (String name : nullSafeSet(names)) { + for (String name : safeNames) { BeanFactory existingBeanFactory = BEAN_FACTORIES.putIfAbsent(name, beanFactory); diff --git a/src/test/java/org/springframework/data/gemfire/CacheFactoryBeanTest.java b/src/test/java/org/springframework/data/gemfire/CacheFactoryBeanTest.java index e5996751..5adc22f1 100644 --- a/src/test/java/org/springframework/data/gemfire/CacheFactoryBeanTest.java +++ b/src/test/java/org/springframework/data/gemfire/CacheFactoryBeanTest.java @@ -33,8 +33,11 @@ import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; import static org.mockito.Matchers.same; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyZeroInteractions; @@ -66,7 +69,6 @@ import org.mockito.junit.MockitoJUnitRunner; import org.springframework.beans.factory.BeanFactory; import org.springframework.core.io.Resource; import org.springframework.data.gemfire.support.GemfireBeanFactoryLocator; -import org.springframework.data.util.ReflectionUtils; /** * Unit tests for {@link CacheFactoryBean}. @@ -702,15 +704,14 @@ public class CacheFactoryBeanTest { when(mockCache.isClosed()).thenReturn(false); - CacheFactoryBean cacheFactoryBean = new CacheFactoryBean() { - @Override protected GemFireCache fetchCache() { - fetchCacheCalled.set(true); - return mockCache; - } - }; + CacheFactoryBean cacheFactoryBean = spy(new CacheFactoryBean()); - ReflectionUtils.setField(CacheFactoryBean.class.getDeclaredField("beanFactoryLocator"), cacheFactoryBean, - mockGemfireBeanFactoryLocator); + doAnswer(invocation -> { + fetchCacheCalled.set(true); + return mockCache; + }).when(cacheFactoryBean).fetchCache(); + + doReturn(mockGemfireBeanFactoryLocator).when(cacheFactoryBean).getBeanFactoryLocator(); cacheFactoryBean.setClose(true); cacheFactoryBean.setUseBeanFactoryLocator(true); @@ -729,12 +730,12 @@ public class CacheFactoryBeanTest { AtomicBoolean fetchCacheCalled = new AtomicBoolean(false); - CacheFactoryBean cacheFactoryBean = new CacheFactoryBean() { - @Override protected T fetchCache() { - fetchCacheCalled.set(true); - return null; - } - }; + CacheFactoryBean cacheFactoryBean = spy(new CacheFactoryBean()); + + doAnswer(invocation -> { + fetchCacheCalled.set(true); + return null; + }).when(cacheFactoryBean).fetchCache(); cacheFactoryBean.setClose(true); cacheFactoryBean.setUseBeanFactoryLocator(true); @@ -745,27 +746,13 @@ public class CacheFactoryBeanTest { @Test @SuppressWarnings("unchecked") - public void destroyWhenCacheClosedIsTrue() throws Exception { + public void destroyWhenCloseIsFalse() throws Exception { - AtomicBoolean fetchCacheCalled = new AtomicBoolean(false); - - Cache mockCache = mock(Cache.class, "GemFireCache"); - - CacheFactoryBean cacheFactoryBean = new CacheFactoryBean() { - @Override @SuppressWarnings("unchecked") protected T fetchCache() { - fetchCacheCalled.set(true); - return (T) mockCache; - } - }; + CacheFactoryBean cacheFactoryBean = new CacheFactoryBean(); cacheFactoryBean.setClose(false); cacheFactoryBean.setUseBeanFactoryLocator(false); cacheFactoryBean.destroy(); - - verify(mockCache, never()).isClosed(); - verify(mockCache, never()).close(); - - assertFalse(fetchCacheCalled.get()); } @Test