PageRenderTime 59ms CodeModel.GetById 23ms RepoModel.GetById 1ms app.codeStats 0ms

/spring-beans/src/test/java/org/springframework/beans/factory/aot/AutowiredMethodArgumentsResolverTests.java

https://github.com/spring-projects/spring-framework
Java | 228 lines | 177 code | 30 blank | 21 comment | 0 complexity | 23790f72fb918ec6f6ee705fa434e320 MD5 | raw file
  1. /*
  2. * Copyright 2002-2022 the original author or authors.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * https://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package org.springframework.beans.factory.aot;
  17. import java.io.InputStream;
  18. import java.util.ArrayList;
  19. import java.util.List;
  20. import java.util.Map;
  21. import org.junit.jupiter.api.Test;
  22. import org.springframework.beans.factory.UnsatisfiedDependencyException;
  23. import org.springframework.beans.factory.config.DependencyDescriptor;
  24. import org.springframework.beans.factory.support.DefaultListableBeanFactory;
  25. import org.springframework.beans.factory.support.RegisteredBean;
  26. import org.springframework.beans.factory.support.RootBeanDefinition;
  27. import org.springframework.core.env.Environment;
  28. import static org.assertj.core.api.Assertions.assertThat;
  29. import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
  30. import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
  31. import static org.mockito.Mockito.mock;
  32. /**
  33. * Tests for {@link AutowiredMethodArgumentsResolver}.
  34. *
  35. * @author Phillip Webb
  36. * @author Stephane Nicoll
  37. */
  38. class AutowiredMethodArgumentsResolverTests {
  39. private final DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
  40. @Test
  41. void forMethodWhenMethodNameIsEmptyThrowsException() {
  42. String message = "'methodName' must not be empty";
  43. assertThatIllegalArgumentException()
  44. .isThrownBy(() -> AutowiredMethodArgumentsResolver.forMethod(null))
  45. .withMessage(message);
  46. assertThatIllegalArgumentException()
  47. .isThrownBy(() -> AutowiredMethodArgumentsResolver.forMethod(""))
  48. .withMessage(message);
  49. assertThatIllegalArgumentException()
  50. .isThrownBy(
  51. () -> AutowiredMethodArgumentsResolver.forRequiredMethod(null))
  52. .withMessage(message);
  53. assertThatIllegalArgumentException()
  54. .isThrownBy(() -> AutowiredMethodArgumentsResolver.forRequiredMethod(" "))
  55. .withMessage(message);
  56. }
  57. @Test
  58. void resolveWhenRegisteredBeanIsNullThrowsException() {
  59. assertThatIllegalArgumentException()
  60. .isThrownBy(() -> AutowiredMethodArgumentsResolver
  61. .forMethod("injectString", String.class).resolve(null))
  62. .withMessage("'registeredBean' must not be null");
  63. }
  64. @Test
  65. void resolveWhenMethodIsMissingThrowsException() {
  66. RegisteredBean registeredBean = registerTestBean(this.beanFactory);
  67. assertThatIllegalArgumentException()
  68. .isThrownBy(() -> AutowiredMethodArgumentsResolver
  69. .forMethod("missing", InputStream.class).resolve(registeredBean))
  70. .withMessage(
  71. "Method 'missing' with parameter types [java.io.InputStream] declared on "
  72. + TestBean.class.getName());
  73. }
  74. @Test
  75. void resolveRequiredWithSingleDependencyReturnsValue() {
  76. this.beanFactory.registerSingleton("test", "testValue");
  77. RegisteredBean registeredBean = registerTestBean(this.beanFactory);
  78. AutowiredMethodArgumentsResolver resolver = AutowiredMethodArgumentsResolver
  79. .forRequiredMethod("injectString", String.class);
  80. AutowiredArguments resolved = resolver.resolve(registeredBean);
  81. assertThat(resolved.toArray()).containsExactly("testValue");
  82. }
  83. @Test
  84. void resolveRequiredWhenNoSuchBeanThrowsUnsatisfiedDependencyException() {
  85. RegisteredBean registeredBean = registerTestBean(this.beanFactory);
  86. AutowiredMethodArgumentsResolver resolver = AutowiredMethodArgumentsResolver
  87. .forRequiredMethod("injectString", String.class);
  88. assertThatExceptionOfType(UnsatisfiedDependencyException.class)
  89. .isThrownBy(() -> resolver.resolve(registeredBean)).satisfies(ex -> {
  90. assertThat(ex.getBeanName()).isEqualTo("testBean");
  91. assertThat(ex.getInjectionPoint()).isNotNull();
  92. assertThat(ex.getInjectionPoint().getMember().getName())
  93. .isEqualTo("injectString");
  94. });
  95. }
  96. @Test
  97. void resolveNonRequiredWhenNoSuchBeanReturnsNull() {
  98. RegisteredBean registeredBean = registerTestBean(this.beanFactory);
  99. AutowiredMethodArgumentsResolver resolver = AutowiredMethodArgumentsResolver
  100. .forMethod("injectString", String.class);
  101. assertThat(resolver.resolve(registeredBean)).isNull();
  102. }
  103. @Test
  104. void resolveRequiredWithMultipleDependencesReturnsValue() {
  105. Environment environment = mock(Environment.class);
  106. this.beanFactory.registerSingleton("test", "testValue");
  107. this.beanFactory.registerSingleton("environment", environment);
  108. RegisteredBean registeredBean = registerTestBean(this.beanFactory);
  109. AutowiredMethodArgumentsResolver resolver = AutowiredMethodArgumentsResolver
  110. .forRequiredMethod("injectStringAndEnvironment", String.class,
  111. Environment.class);
  112. AutowiredArguments resolved = resolver.resolve(registeredBean);
  113. assertThat(resolved.toArray()).containsExactly("testValue", environment);
  114. }
  115. @Test
  116. void resolveAndInvokeWhenInstanceIsNullThrowsException() {
  117. RegisteredBean registeredBean = registerTestBean(this.beanFactory);
  118. assertThatIllegalArgumentException()
  119. .isThrownBy(() -> AutowiredMethodArgumentsResolver
  120. .forMethod("injectString", String.class)
  121. .resolveAndInvoke(registeredBean, null))
  122. .withMessage("'instance' must not be null");
  123. }
  124. @Test
  125. void resolveAndInvokeInvokesMethod() {
  126. this.beanFactory.registerSingleton("test", "testValue");
  127. RegisteredBean registeredBean = registerTestBean(this.beanFactory);
  128. AutowiredMethodArgumentsResolver resolver = AutowiredMethodArgumentsResolver
  129. .forRequiredMethod("injectString", String.class);
  130. TestBean instance = new TestBean();
  131. resolver.resolveAndInvoke(registeredBean, instance);
  132. assertThat(instance.getString()).isEqualTo("testValue");
  133. }
  134. @Test
  135. void resolveWithActionWhenActionIsNullThrowsException() {
  136. RegisteredBean registeredBean = registerTestBean(this.beanFactory);
  137. assertThatIllegalArgumentException()
  138. .isThrownBy(() -> AutowiredMethodArgumentsResolver
  139. .forMethod("injectString", String.class)
  140. .resolve(registeredBean, null))
  141. .withMessage("'action' must not be null");
  142. }
  143. @Test
  144. void resolveWithActionCallsAction() {
  145. this.beanFactory.registerSingleton("test", "testValue");
  146. RegisteredBean registeredBean = registerTestBean(this.beanFactory);
  147. List<Object> result = new ArrayList<>();
  148. AutowiredMethodArgumentsResolver.forMethod("injectString", String.class)
  149. .resolve(registeredBean, result::add);
  150. assertThat(result).hasSize(1);
  151. assertThat(((AutowiredArguments) result.get(0)).toArray())
  152. .containsExactly("testValue");
  153. }
  154. @Test
  155. void resolveWhenUsingShortcutsInjectsDirectly() {
  156. DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory() {
  157. @Override
  158. protected Map<String, Object> findAutowireCandidates(String beanName,
  159. Class<?> requiredType, DependencyDescriptor descriptor) {
  160. throw new AssertionError("Should be shortcut");
  161. }
  162. };
  163. beanFactory.registerSingleton("test", "testValue");
  164. RegisteredBean registeredBean = registerTestBean(beanFactory);
  165. AutowiredMethodArgumentsResolver resolver = AutowiredMethodArgumentsResolver
  166. .forRequiredMethod("injectString", String.class);
  167. assertThatExceptionOfType(AssertionError.class)
  168. .isThrownBy(() -> resolver.resolve(registeredBean));
  169. assertThat(resolver.withShortcut("test").resolve(registeredBean).getObject(0))
  170. .isEqualTo("testValue");
  171. }
  172. @Test
  173. void resolveRegistersDependantBeans() {
  174. this.beanFactory.registerSingleton("test", "testValue");
  175. RegisteredBean registeredBean = registerTestBean(this.beanFactory);
  176. AutowiredMethodArgumentsResolver.forMethod("injectString", String.class)
  177. .resolve(registeredBean);
  178. assertThat(this.beanFactory.getDependentBeans("test"))
  179. .containsExactly("testBean");
  180. }
  181. private RegisteredBean registerTestBean(DefaultListableBeanFactory beanFactory) {
  182. beanFactory.registerBeanDefinition("testBean",
  183. new RootBeanDefinition(TestBean.class));
  184. return RegisteredBean.of(beanFactory, "testBean");
  185. }
  186. @SuppressWarnings("unused")
  187. static class TestBean {
  188. private String string;
  189. void injectString(String string) {
  190. this.string = string;
  191. }
  192. void injectStringAndEnvironment(String string, Environment environment) {
  193. }
  194. String getString() {
  195. return this.string;
  196. }
  197. }
  198. }