diff --git a/apollo-client/src/test/java/com/ctrip/framework/apollo/spring/JavaConfigAnnotationTest.java b/apollo-client/src/test/java/com/ctrip/framework/apollo/spring/JavaConfigAnnotationTest.java index 5f05a2663a7e7d7a6551dd5b11549ffd053cd604..c278eb92edc4a33ab51ca57e6cbc45daa4e39ecb 100644 --- a/apollo-client/src/test/java/com/ctrip/framework/apollo/spring/JavaConfigAnnotationTest.java +++ b/apollo-client/src/test/java/com/ctrip/framework/apollo/spring/JavaConfigAnnotationTest.java @@ -54,6 +54,22 @@ public class JavaConfigAnnotationTest extends AbstractSpringIntegrationTest { getBean(TestApolloConfigBean2.class, AppConfig2.class); } + @Test + public void testApolloConfigWithInheritance() throws Exception { + Config applicationConfig = mock(Config.class); + Config fxApolloConfig = mock(Config.class); + + mockConfig(ConfigConsts.NAMESPACE_APPLICATION, applicationConfig); + mockConfig(FX_APOLLO_NAMESPACE, fxApolloConfig); + + TestApolloChildConfigBean bean = getBean(TestApolloChildConfigBean.class, AppConfig6.class); + + assertEquals(applicationConfig, bean.getConfig()); + assertEquals(applicationConfig, bean.getAnotherConfig()); + assertEquals(fxApolloConfig, bean.getYetAnotherConfig()); + assertEquals(applicationConfig, bean.getSomeConfig()); + } + @Test public void testApolloConfigChangeListener() throws Exception { Config applicationConfig = mock(Config.class); @@ -127,6 +143,63 @@ public class JavaConfigAnnotationTest extends AbstractSpringIntegrationTest { getBean(TestApolloConfigChangeListenerBean3.class, AppConfig5.class); } + @Test + public void testApolloConfigChangeListenerWithInheritance() throws Exception { + Config applicationConfig = mock(Config.class); + Config fxApolloConfig = mock(Config.class); + + mockConfig(ConfigConsts.NAMESPACE_APPLICATION, applicationConfig); + mockConfig(FX_APOLLO_NAMESPACE, fxApolloConfig); + + final List applicationListeners = Lists.newArrayList(); + final List fxApolloListeners = Lists.newArrayList(); + + doAnswer(new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + applicationListeners.add(invocation.getArgumentAt(0, ConfigChangeListener.class)); + + return Void.class; + } + }).when(applicationConfig).addChangeListener(any(ConfigChangeListener.class)); + + doAnswer(new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + fxApolloListeners.add(invocation.getArgumentAt(0, ConfigChangeListener.class)); + + return Void.class; + } + }).when(fxApolloConfig).addChangeListener(any(ConfigChangeListener.class)); + + ConfigChangeEvent someEvent = mock(ConfigChangeEvent.class); + ConfigChangeEvent anotherEvent = mock(ConfigChangeEvent.class); + + TestApolloChildConfigChangeListener bean = getBean(TestApolloChildConfigChangeListener.class, AppConfig7.class); + + //PropertySourcesProcessor add listeners to listen config changed of all namespace + assertEquals(5, applicationListeners.size()); + assertEquals(1, fxApolloListeners.size()); + + for (ConfigChangeListener listener : applicationListeners) { + listener.onChange(someEvent); + } + + assertEquals(someEvent, bean.getChangeEvent1()); + assertEquals(someEvent, bean.getChangeEvent2()); + assertEquals(someEvent, bean.getChangeEvent3()); + assertEquals(someEvent, bean.getSomeChangeEvent()); + + for (ConfigChangeListener listener : fxApolloListeners) { + listener.onChange(anotherEvent); + } + + assertEquals(someEvent, bean.getChangeEvent1()); + assertEquals(someEvent, bean.getChangeEvent2()); + assertEquals(anotherEvent, bean.getChangeEvent3()); + assertEquals(someEvent, bean.getSomeChangeEvent()); + } + private T getBean(Class beanClass, Class... annotatedClasses) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(annotatedClasses); @@ -178,6 +251,24 @@ public class JavaConfigAnnotationTest extends AbstractSpringIntegrationTest { } } + @Configuration + @EnableApolloConfig + static class AppConfig6 { + @Bean + public TestApolloChildConfigBean bean() { + return new TestApolloChildConfigBean(); + } + } + + @Configuration + @EnableApolloConfig + static class AppConfig7 { + @Bean + public TestApolloChildConfigChangeListener bean() { + return new TestApolloChildConfigChangeListener(); + } + } + static class TestApolloConfigBean1 { @ApolloConfig private Config config; @@ -199,11 +290,21 @@ public class JavaConfigAnnotationTest extends AbstractSpringIntegrationTest { } } - public static class TestApolloConfigBean2 { + static class TestApolloConfigBean2 { @ApolloConfig private String config; } + static class TestApolloChildConfigBean extends TestApolloConfigBean1 { + + @ApolloConfig + private Config someConfig; + + public Config getSomeConfig() { + return someConfig; + } + } + static class TestApolloConfigChangeListenerBean1 { private ConfigChangeEvent changeEvent1; private ConfigChangeEvent changeEvent2; @@ -251,4 +352,17 @@ public class JavaConfigAnnotationTest extends AbstractSpringIntegrationTest { } } + static class TestApolloChildConfigChangeListener extends TestApolloConfigChangeListenerBean1 { + + private ConfigChangeEvent someChangeEvent; + + @ApolloConfigChangeListener + private void someOnChange(ConfigChangeEvent changeEvent) { + this.someChangeEvent = changeEvent; + } + + public ConfigChangeEvent getSomeChangeEvent() { + return someChangeEvent; + } + } }