From 53893bd49f242dca68de52616698421665e2402d Mon Sep 17 00:00:00 2001 From: John Blum Date: Tue, 19 May 2020 21:58:00 -0700 Subject: [PATCH] Add support to suppress GemFire/Geode Mock Object destruction on ContextClosedEvents. --- .../annotation/EnableGemFireMockObjects.java | 12 ++ .../GemFireMockObjectsConfiguration.java | 35 +++++- ...FireMockObjectsConfigurationUnitTests.java | 112 ++++++++++++++++++ 3 files changed, 155 insertions(+), 4 deletions(-) create mode 100644 spring-data-geode-test/src/test/java/org/springframework/data/gemfire/tests/mock/annotation/GemFireMockObjectsConfigurationUnitTests.java diff --git a/spring-data-geode-test/src/main/java/org/springframework/data/gemfire/tests/mock/annotation/EnableGemFireMockObjects.java b/spring-data-geode-test/src/main/java/org/springframework/data/gemfire/tests/mock/annotation/EnableGemFireMockObjects.java index 2165fec..94c1a92 100644 --- a/spring-data-geode-test/src/main/java/org/springframework/data/gemfire/tests/mock/annotation/EnableGemFireMockObjects.java +++ b/spring-data-geode-test/src/main/java/org/springframework/data/gemfire/tests/mock/annotation/EnableGemFireMockObjects.java @@ -46,6 +46,18 @@ import org.springframework.context.annotation.Import; @SuppressWarnings("unused") public @interface EnableGemFireMockObjects { + /** + * Configures whether the {@link org.springframework.context.event.ContextClosedEvent} Spring + * {@link org.springframework.context.ApplicationEvent} listener and handler for GemFire/Geode + * {@link Object Mock Objects} is suppressed from taking action. + * + * Defaults to {@literal false}. + * + * @return a boolean value indicating whether the {@link org.springframework.context.event.ContextClosedEvent} + * listener and handler for GemFire/Geode {@link Object Mock Objects} is suppressed from taking action. + */ + boolean suppressOnContextClosedEventHandler() default false; + /** * Configures whether the mock {@link GemFireCache} created for Unit Testing is a Singleton. * diff --git a/spring-data-geode-test/src/main/java/org/springframework/data/gemfire/tests/mock/annotation/GemFireMockObjectsConfiguration.java b/spring-data-geode-test/src/main/java/org/springframework/data/gemfire/tests/mock/annotation/GemFireMockObjectsConfiguration.java index b1c6031..78cc16b 100644 --- a/spring-data-geode-test/src/main/java/org/springframework/data/gemfire/tests/mock/annotation/GemFireMockObjectsConfiguration.java +++ b/spring-data-geode-test/src/main/java/org/springframework/data/gemfire/tests/mock/annotation/GemFireMockObjectsConfiguration.java @@ -53,6 +53,8 @@ import org.springframework.data.gemfire.tests.mock.config.GemFireMockObjectsBean @SuppressWarnings("unused") public class GemFireMockObjectsConfiguration implements ApplicationListener, ImportAware { + private boolean suppressContextClosedEventHandler = false; + private boolean useSingletonCache = false; @Override @SuppressWarnings("all") @@ -61,8 +63,14 @@ public class GemFireMockObjectsConfiguration implements ApplicationListener - this.useSingletonCache = enableGemFireMockObjectsAttributes.getBoolean("useSingletonCache")); + .ifPresent(enableGemFireMockObjectsAttributes -> { + + this.suppressContextClosedEventHandler = + enableGemFireMockObjectsAttributes.getBoolean("suppressOnContextClosedEventHandler"); + + this.useSingletonCache = + enableGemFireMockObjectsAttributes.getBoolean("useSingletonCache"); + }); } private Class getAnnotationType() { @@ -89,18 +97,37 @@ public class GemFireMockObjectsConfiguration implements ApplicationListener enableGemFireMockObjectsAttributes = new HashMap<>(); + + enableGemFireMockObjectsAttributes.put("suppressOnContextClosedEventHandler", true); + enableGemFireMockObjectsAttributes.put("useSingletonCache", true); + + AnnotationMetadata mockAnnotationMetadata = mock(AnnotationMetadata.class); + + doReturn(true).when(mockAnnotationMetadata) + .hasAnnotation(eq(EnableGemFireMockObjects.class.getName())); + + doReturn(enableGemFireMockObjectsAttributes).when(mockAnnotationMetadata) + .getAnnotationAttributes(eq(EnableGemFireMockObjects.class.getName())); + + configuration.setImportMetadata(mockAnnotationMetadata); + + assertThat(configuration.isSuppressOnContextClosedEvent()).isTrue(); + assertThat(configuration.isUseSingletonCacheConfigured()).isTrue(); + + verify(mockAnnotationMetadata, times(1)) + .hasAnnotation(eq(EnableGemFireMockObjects.class.getName())); + verify(mockAnnotationMetadata, times(1)) + .getAnnotationAttributes(eq(EnableGemFireMockObjects.class.getName())); + } + + @Test + public void destroysGemFireMockObjectsWhenSuppressOnContextClosedEventIsFalse() { + + ContextClosedEvent mockEvent = mock(ContextClosedEvent.class); + + GemFireMockObjectsConfiguration configuration = spy(new GemFireMockObjectsConfiguration()); + + doReturn(false).when(configuration).isSuppressOnContextClosedEvent(); + doNothing().when(configuration).destroyGemFireMockObjects(); + + configuration.onApplicationEvent(mockEvent); + + verify(configuration, times(1)).destroyGemFireMockObjects(); + verify(configuration, times(1)).releaseMockObjectResources(eq(mockEvent)); + } + + @Test + public void doesNotDestroyGemFireMockObjectsWhenSuppressOnContextClosedEventIsTrue() { + + ContextClosedEvent mockEvent = mock(ContextClosedEvent.class); + + GemFireMockObjectsConfiguration configuration = spy(new GemFireMockObjectsConfiguration()); + + doReturn(true).when(configuration).isSuppressOnContextClosedEvent(); + doNothing().when(configuration).destroyGemFireMockObjects(); + + configuration.onApplicationEvent(mockEvent); + + verify(configuration, never()).destroyGemFireMockObjects(); + verify(configuration, times(1)).releaseMockObjectResources(eq(mockEvent)); + } +}