View Javadoc
1   package com.atlassian.plugin.spring;
2   
3   import com.atlassian.plugin.osgi.hostcomponents.ContextClassLoaderStrategy;
4   import org.junit.Test;
5   import org.junit.runner.RunWith;
6   import org.mockito.Mock;
7   import org.mockito.junit.MockitoJUnitRunner;
8   import org.springframework.context.annotation.AnnotationConfigApplicationContext;
9   import org.springframework.context.annotation.Bean;
10  import org.springframework.context.annotation.Configuration;
11  import org.springframework.context.annotation.Scope;
12  
13  import java.util.List;
14  import java.util.Map;
15  import java.util.Set;
16  
17  import static com.atlassian.plugin.osgi.hostcomponents.ContextClassLoaderStrategy.USE_HOST;
18  import static com.atlassian.plugin.osgi.hostcomponents.ContextClassLoaderStrategy.USE_PLUGIN;
19  import static org.mockito.Mockito.never;
20  import static org.mockito.Mockito.verify;
21  
22  @RunWith(MockitoJUnitRunner.class)
23  public class TestAvailableToPluginsBeanDefinitionRegistryProcessor {
24  
25      @Mock
26      static PluginBeanDefinitionRegistry pluginBeanDefinitionRegistry;
27  
28      @Test
29      public void beanMethodAnnotationsAreProcessed() {
30          new AnnotationConfigApplicationContext(Config.class);
31  
32          verify(pluginBeanDefinitionRegistry).addBeanName("simplePluginAvailableBean");
33          verify(pluginBeanDefinitionRegistry).addContextClassLoaderStrategy("simplePluginAvailableBean", USE_HOST);
34  
35          verify(pluginBeanDefinitionRegistry).addBeanName("complexPluginAvailableBean");
36          verify(pluginBeanDefinitionRegistry).addBeanInterface("complexPluginAvailableBean", "java.util.Set");
37          verify(pluginBeanDefinitionRegistry).addBeanInterface("complexPluginAvailableBean", "java.util.Map");
38          verify(pluginBeanDefinitionRegistry).addBeanInterface("complexPluginAvailableBean", "java.util.List");
39          verify(pluginBeanDefinitionRegistry).addContextClassLoaderStrategy("complexPluginAvailableBean", USE_PLUGIN);
40          verify(pluginBeanDefinitionRegistry).addBundleTrackingBean("complexPluginAvailableBean");
41  
42          verify(pluginBeanDefinitionRegistry, never()).addBeanName("nonPluginAvailableBean");
43          verify(pluginBeanDefinitionRegistry, never()).addBeanName("prototypeBean");
44      }
45  
46      @Configuration
47      public static class Config {
48          @Bean
49          public Object nonPluginAvailableBean() {
50              return new Object();
51          }
52  
53          @Bean
54          @AvailableToPlugins
55          public Object simplePluginAvailableBean() {
56              return new Object();
57          }
58  
59          @Bean
60          @AvailableToPlugins(
61                  value = Set.class,
62                  interfaces = {List.class, Map.class},
63                  contextClassLoaderStrategy = ContextClassLoaderStrategy.USE_PLUGIN,
64                  trackBundle = true)
65          public Object complexPluginAvailableBean() {
66              return new Object();
67          }
68  
69          @Bean
70          @AvailableToPlugins
71          @Scope("prototype")
72          public Object prototypeBean() {
73              return new Object();
74          }
75  
76          @Bean
77          public AvailableToPluginsBeanDefinitionRegistryProcessor availableToPluginsProcessor() {
78              return new AvailableToPluginsBeanDefinitionRegistryProcessor(
79                      (registry) -> pluginBeanDefinitionRegistry
80              );
81          }
82      }
83  }