From 94a42737ec482a47632c334ecac7eb03f4000c3d Mon Sep 17 00:00:00 2001 From: Johannes Edmeier Date: Tue, 25 Jul 2017 17:58:15 +0200 Subject: [PATCH] Fix empty keys in EnvironmentChangedEvent on resetting the Environment (#229) When the Environment is resetted the EnvironmentChangedEvent always contains an empty keySet, since the live view of the cleared map was used. This commit fixes this. --- .../environment/EnvironmentManager.java | 3 +- .../environment/EnvironmentManagerTest.java | 45 +++++++++++++++++++ 2 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 spring-cloud-context/src/test/java/org/springframework/cloud/context/environment/EnvironmentManagerTest.java diff --git a/spring-cloud-context/src/main/java/org/springframework/cloud/context/environment/EnvironmentManager.java b/spring-cloud-context/src/main/java/org/springframework/cloud/context/environment/EnvironmentManager.java index 91e625cf..6b4b7639 100644 --- a/spring-cloud-context/src/main/java/org/springframework/cloud/context/environment/EnvironmentManager.java +++ b/spring-cloud-context/src/main/java/org/springframework/cloud/context/environment/EnvironmentManager.java @@ -68,9 +68,8 @@ public class EnvironmentManager implements ApplicationEventPublisherAware { public Map reset() { Map result = new LinkedHashMap(map); if (!map.isEmpty()) { - Set keys = map.keySet(); map.clear(); - publish(new EnvironmentChangeEvent(keys)); + publish(new EnvironmentChangeEvent(result.keySet())); } return result; } diff --git a/spring-cloud-context/src/test/java/org/springframework/cloud/context/environment/EnvironmentManagerTest.java b/spring-cloud-context/src/test/java/org/springframework/cloud/context/environment/EnvironmentManagerTest.java new file mode 100644 index 00000000..518afe74 --- /dev/null +++ b/spring-cloud-context/src/test/java/org/springframework/cloud/context/environment/EnvironmentManagerTest.java @@ -0,0 +1,45 @@ +package org.springframework.cloud.context.environment; + + +import org.junit.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Mockito; +import org.springframework.context.ApplicationEvent; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.mock.env.MockEnvironment; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.*; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +public class EnvironmentManagerTest { + + @Test + public void testCorrectEvents() { + MockEnvironment environment = new MockEnvironment(); + ApplicationEventPublisher publisher = mock(ApplicationEventPublisher.class); + EnvironmentManager environmentManager = new EnvironmentManager(environment); + environmentManager.setApplicationEventPublisher(publisher); + + environmentManager.setProperty("foo", "bar"); + + assertThat(environment.getProperty("foo")).isEqualTo("bar"); + ArgumentCaptor eventCaptor = ArgumentCaptor.forClass(ApplicationEvent.class); + verify(publisher, times(1)).publishEvent(eventCaptor.capture()); + assertThat(eventCaptor.getValue()).isInstanceOf(EnvironmentChangeEvent.class); + EnvironmentChangeEvent event = (EnvironmentChangeEvent) eventCaptor.getValue(); + assertThat(event.getKeys()).containsExactly("foo"); + + reset(publisher); + + environmentManager.reset(); + assertThat(environment.getProperty("foo")).isNull(); + verify(publisher, times(1)).publishEvent(eventCaptor.capture()); + assertThat(eventCaptor.getValue()).isInstanceOf(EnvironmentChangeEvent.class); + event = (EnvironmentChangeEvent) eventCaptor.getValue(); + assertThat(event.getKeys()).containsExactly("foo"); + } + +} \ No newline at end of file