Browse Source

Polishing

pull/31305/head
Sam Brannen 1 year ago
parent
commit
a88d5d1c62
  1. 353
      spring-beans/src/test/java/org/springframework/beans/factory/support/BeanFactoryGenericsTests.java
  2. 64
      spring-beans/src/test/resources/org/springframework/beans/factory/support/genericBeanTests.xml

353
spring-beans/src/test/java/org/springframework/beans/factory/support/BeanFactoryGenericsTests.java

@ -16,13 +16,12 @@ @@ -16,13 +16,12 @@
package org.springframework.beans.factory.support;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
import java.util.AbstractCollection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
@ -49,11 +48,10 @@ import org.springframework.core.annotation.AnnotationAwareOrderComparator; @@ -49,11 +48,10 @@ import org.springframework.core.annotation.AnnotationAwareOrderComparator;
import org.springframework.core.annotation.Order;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.UrlResource;
import org.springframework.core.testfixture.EnabledForTestGroups;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
import static org.springframework.core.testfixture.TestGroup.LONG_RUNNING;
import static org.assertj.core.api.Assertions.entry;
/**
* @author Juergen Hoeller
@ -64,41 +62,35 @@ import static org.springframework.core.testfixture.TestGroup.LONG_RUNNING; @@ -64,41 +62,35 @@ import static org.springframework.core.testfixture.TestGroup.LONG_RUNNING;
class BeanFactoryGenericsTests {
@Test
void testGenericSetProperty() {
void genericSetProperty() {
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
RootBeanDefinition rbd = new RootBeanDefinition(GenericBean.class);
Set<String> input = new HashSet<>();
input.add("4");
input.add("5");
rbd.getPropertyValues().add("integerSet", input);
rbd.getPropertyValues().add("integerSet", Set.of("4", "5"));
bf.registerBeanDefinition("genericBean", rbd);
GenericBean<?> gb = (GenericBean<?>) bf.getBean("genericBean");
assertThat(gb.getIntegerSet().contains(4)).isTrue();
assertThat(gb.getIntegerSet().contains(5)).isTrue();
assertThat(gb.getIntegerSet()).containsExactlyInAnyOrder(4, 5);
}
@Test
void testGenericListProperty() throws Exception {
void genericListProperty() throws Exception {
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
RootBeanDefinition rbd = new RootBeanDefinition(GenericBean.class);
List<String> input = new ArrayList<>();
input.add("http://localhost:8080");
input.add("http://localhost:9090");
List<String> input = List.of("http://localhost:8080", "http://localhost:9090");
rbd.getPropertyValues().add("resourceList", input);
bf.registerBeanDefinition("genericBean", rbd);
GenericBean<?> gb = (GenericBean<?>) bf.getBean("genericBean");
assertThat(gb.getResourceList().get(0)).isEqualTo(new UrlResource("http://localhost:8080"));
assertThat(gb.getResourceList().get(1)).isEqualTo(new UrlResource("http://localhost:9090"));
assertThat(gb.getResourceList())
.containsExactly(new UrlResource("http://localhost:8080"), new UrlResource("http://localhost:9090"));
}
@Test
void testGenericListPropertyWithAutowiring() throws Exception {
void genericListPropertyWithAutowiring() throws Exception {
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
bf.registerSingleton("resource1", new UrlResource("http://localhost:8080"));
bf.registerSingleton("resource2", new UrlResource("http://localhost:9090"));
@ -108,22 +100,19 @@ class BeanFactoryGenericsTests { @@ -108,22 +100,19 @@ class BeanFactoryGenericsTests {
bf.registerBeanDefinition("genericBean", rbd);
GenericIntegerBean gb = (GenericIntegerBean) bf.getBean("genericBean");
assertThat(gb.getResourceList().get(0)).isEqualTo(new UrlResource("http://localhost:8080"));
assertThat(gb.getResourceList().get(1)).isEqualTo(new UrlResource("http://localhost:9090"));
assertThat(gb.getResourceList())
.containsExactly(new UrlResource("http://localhost:8080"), new UrlResource("http://localhost:9090"));
}
@Test
void testGenericListPropertyWithInvalidElementType() {
void genericListPropertyWithInvalidElementType() {
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
RootBeanDefinition rbd = new RootBeanDefinition(GenericIntegerBean.class);
List<Integer> input = new ArrayList<>();
input.add(1);
rbd.getPropertyValues().add("testBeanList", input);
rbd.getPropertyValues().add("testBeanList", List.of(1));
bf.registerBeanDefinition("genericBean", rbd);
assertThatExceptionOfType(BeanCreationException.class).isThrownBy(() ->
bf.getBean("genericBean"))
assertThatExceptionOfType(BeanCreationException.class).isThrownBy(() -> bf.getBean("genericBean"))
.withMessageContaining("genericBean")
.withMessageContaining("testBeanList[0]")
.withMessageContaining(TestBean.class.getName())
@ -131,7 +120,7 @@ class BeanFactoryGenericsTests { @@ -131,7 +120,7 @@ class BeanFactoryGenericsTests {
}
@Test
void testGenericListPropertyWithOptionalAutowiring() {
void genericListPropertyWithOptionalAutowiring() {
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
RootBeanDefinition rbd = new RootBeanDefinition(GenericBean.class);
@ -143,13 +132,13 @@ class BeanFactoryGenericsTests { @@ -143,13 +132,13 @@ class BeanFactoryGenericsTests {
}
@Test
void testGenericMapProperty() {
void genericMapProperty() {
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
RootBeanDefinition rbd = new RootBeanDefinition(GenericBean.class);
Map<String, String> input = new HashMap<>();
input.put("4", "5");
input.put("6", "7");
Map<String, String> input = Map.of(
"4", "5",
"6", "7");
rbd.getPropertyValues().add("shortMap", input);
bf.registerBeanDefinition("genericBean", rbd);
@ -160,39 +149,31 @@ class BeanFactoryGenericsTests { @@ -160,39 +149,31 @@ class BeanFactoryGenericsTests {
}
@Test
void testGenericListOfArraysProperty() {
void genericListOfArraysProperty() {
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
new XmlBeanDefinitionReader(bf).loadBeanDefinitions(
new ClassPathResource("genericBeanTests.xml", getClass()));
GenericBean<?> gb = (GenericBean<?>) bf.getBean("listOfArrays");
assertThat(gb.getListOfArrays()).hasSize(1);
String[] array = gb.getListOfArrays().get(0);
assertThat(array).hasSize(2);
assertThat(array[0]).isEqualTo("value1");
assertThat(array[1]).isEqualTo("value2");
assertThat(gb.getListOfArrays()).containsExactly(new String[] {"value1", "value2"});
}
@Test
void testGenericSetConstructor() {
void genericSetConstructor() {
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
RootBeanDefinition rbd = new RootBeanDefinition(GenericBean.class);
Set<String> input = new HashSet<>();
input.add("4");
input.add("5");
Set<String> input = Set.of("4", "5");
rbd.getConstructorArgumentValues().addGenericArgumentValue(input);
bf.registerBeanDefinition("genericBean", rbd);
GenericBean<?> gb = (GenericBean<?>) bf.getBean("genericBean");
assertThat(gb.getIntegerSet().contains(4)).isTrue();
assertThat(gb.getIntegerSet().contains(5)).isTrue();
assertThat(gb.getIntegerSet()).containsExactlyInAnyOrder(4, 5);
}
@Test
void testGenericSetConstructorWithAutowiring() {
void genericSetConstructorWithAutowiring() {
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
bf.registerSingleton("integer1", 4);
bf.registerSingleton("integer2", 5);
@ -202,12 +183,11 @@ class BeanFactoryGenericsTests { @@ -202,12 +183,11 @@ class BeanFactoryGenericsTests {
bf.registerBeanDefinition("genericBean", rbd);
GenericBean<?> gb = (GenericBean<?>) bf.getBean("genericBean");
assertThat(gb.getIntegerSet().contains(4)).isTrue();
assertThat(gb.getIntegerSet().contains(5)).isTrue();
assertThat(gb.getIntegerSet()).containsExactlyInAnyOrder(4, 5);
}
@Test
void testGenericSetConstructorWithOptionalAutowiring() {
void genericSetConstructorWithOptionalAutowiring() {
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
RootBeanDefinition rbd = new RootBeanDefinition(GenericBean.class);
@ -219,30 +199,25 @@ class BeanFactoryGenericsTests { @@ -219,30 +199,25 @@ class BeanFactoryGenericsTests {
}
@Test
void testGenericSetListConstructor() throws Exception {
void genericSetListConstructor() throws Exception {
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
RootBeanDefinition rbd = new RootBeanDefinition(GenericBean.class);
Set<String> input = new HashSet<>();
input.add("4");
input.add("5");
List<String> input2 = new ArrayList<>();
input2.add("http://localhost:8080");
input2.add("http://localhost:9090");
rbd.getConstructorArgumentValues().addGenericArgumentValue(input);
Set<String> input1 = Set.of("4", "5");
List<String> input2 = List.of("http://localhost:8080", "http://localhost:9090");
rbd.getConstructorArgumentValues().addGenericArgumentValue(input1);
rbd.getConstructorArgumentValues().addGenericArgumentValue(input2);
bf.registerBeanDefinition("genericBean", rbd);
GenericBean<?> gb = (GenericBean<?>) bf.getBean("genericBean");
assertThat(gb.getIntegerSet().contains(4)).isTrue();
assertThat(gb.getIntegerSet().contains(5)).isTrue();
assertThat(gb.getResourceList().get(0)).isEqualTo(new UrlResource("http://localhost:8080"));
assertThat(gb.getResourceList().get(1)).isEqualTo(new UrlResource("http://localhost:9090"));
assertThat(gb.getIntegerSet()).containsExactlyInAnyOrder(4, 5);
assertThat(gb.getResourceList())
.containsExactly(new UrlResource("http://localhost:8080"), new UrlResource("http://localhost:9090"));
}
@Test
void testGenericSetListConstructorWithAutowiring() throws Exception {
void genericSetListConstructorWithAutowiring() throws Exception {
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
bf.registerSingleton("integer1", 4);
bf.registerSingleton("integer2", 5);
@ -254,14 +229,13 @@ class BeanFactoryGenericsTests { @@ -254,14 +229,13 @@ class BeanFactoryGenericsTests {
bf.registerBeanDefinition("genericBean", rbd);
GenericBean<?> gb = (GenericBean<?>) bf.getBean("genericBean");
assertThat(gb.getIntegerSet().contains(4)).isTrue();
assertThat(gb.getIntegerSet().contains(5)).isTrue();
assertThat(gb.getResourceList().get(0)).isEqualTo(new UrlResource("http://localhost:8080"));
assertThat(gb.getResourceList().get(1)).isEqualTo(new UrlResource("http://localhost:9090"));
assertThat(gb.getIntegerSet()).containsExactlyInAnyOrder(4, 5);
assertThat(gb.getResourceList())
.containsExactly(new UrlResource("http://localhost:8080"), new UrlResource("http://localhost:9090"));
}
@Test
void testGenericSetListConstructorWithOptionalAutowiring() throws Exception {
void genericSetListConstructorWithOptionalAutowiring() throws Exception {
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
bf.registerSingleton("resource1", new UrlResource("http://localhost:8080"));
bf.registerSingleton("resource2", new UrlResource("http://localhost:9090"));
@ -276,36 +250,33 @@ class BeanFactoryGenericsTests { @@ -276,36 +250,33 @@ class BeanFactoryGenericsTests {
}
@Test
void testGenericSetMapConstructor() {
void genericSetMapConstructor() {
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
RootBeanDefinition rbd = new RootBeanDefinition(GenericBean.class);
Set<String> input = new HashSet<>();
input.add("4");
input.add("5");
Map<String, String> input2 = new HashMap<>();
input2.put("4", "5");
input2.put("6", "7");
rbd.getConstructorArgumentValues().addGenericArgumentValue(input);
Set<String> input1 = Set.of("4", "5");
Map<String, String> input2 = Map.of(
"4", "5",
"6", "7");
rbd.getConstructorArgumentValues().addGenericArgumentValue(input1);
rbd.getConstructorArgumentValues().addGenericArgumentValue(input2);
bf.registerBeanDefinition("genericBean", rbd);
GenericBean<?> gb = (GenericBean<?>) bf.getBean("genericBean");
assertThat(gb.getIntegerSet().contains(4)).isTrue();
assertThat(gb.getIntegerSet().contains(5)).isTrue();
assertThat(gb.getIntegerSet()).containsExactlyInAnyOrder(4, 5);
assertThat(gb.getShortMap().get(Short.valueOf("4"))).isEqualTo(5);
assertThat(gb.getShortMap().get(Short.valueOf("6"))).isEqualTo(7);
}
@Test
void testGenericMapResourceConstructor() throws Exception {
void genericMapResourceConstructor() throws Exception {
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
RootBeanDefinition rbd = new RootBeanDefinition(GenericBean.class);
Map<String, String> input = new HashMap<>();
input.put("4", "5");
input.put("6", "7");
Map<String, String> input = Map.of(
"4", "5",
"6", "7");
rbd.getConstructorArgumentValues().addGenericArgumentValue(input);
rbd.getConstructorArgumentValues().addGenericArgumentValue("http://localhost:8080");
@ -314,21 +285,21 @@ class BeanFactoryGenericsTests { @@ -314,21 +285,21 @@ class BeanFactoryGenericsTests {
assertThat(gb.getShortMap().get(Short.valueOf("4"))).isEqualTo(5);
assertThat(gb.getShortMap().get(Short.valueOf("6"))).isEqualTo(7);
assertThat(gb.getResourceList().get(0)).isEqualTo(new UrlResource("http://localhost:8080"));
assertThat(gb.getResourceList()).containsExactly(new UrlResource("http://localhost:8080"));
}
@Test
void testGenericMapMapConstructor() {
void genericMapMapConstructor() {
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
RootBeanDefinition rbd = new RootBeanDefinition(GenericBean.class);
Map<String, String> input = new HashMap<>();
input.put("1", "0");
input.put("2", "3");
Map<String, String> input2 = new HashMap<>();
input2.put("4", "5");
input2.put("6", "7");
rbd.getConstructorArgumentValues().addGenericArgumentValue(input);
Map<String, String> input1 = Map.of(
"1", "0",
"2", "3");
Map<String, String> input2 = Map.of(
"4", "5",
"6", "7");
rbd.getConstructorArgumentValues().addGenericArgumentValue(input1);
rbd.getConstructorArgumentValues().addGenericArgumentValue(input2);
bf.registerBeanDefinition("genericBean", rbd);
@ -344,13 +315,13 @@ class BeanFactoryGenericsTests { @@ -344,13 +315,13 @@ class BeanFactoryGenericsTests {
}
@Test
void testGenericMapMapConstructorWithSameRefAndConversion() {
void genericMapMapConstructorWithSameRefAndConversion() {
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
RootBeanDefinition rbd = new RootBeanDefinition(GenericBean.class);
Map<String, String> input = new HashMap<>();
input.put("1", "0");
input.put("2", "3");
Map<String, String> input = Map.of(
"1", "0",
"2", "3");
rbd.getConstructorArgumentValues().addGenericArgumentValue(input);
rbd.getConstructorArgumentValues().addGenericArgumentValue(input);
@ -367,7 +338,7 @@ class BeanFactoryGenericsTests { @@ -367,7 +338,7 @@ class BeanFactoryGenericsTests {
}
@Test
void testGenericMapMapConstructorWithSameRefAndNoConversion() {
void genericMapMapConstructorWithSameRefAndNoConversion() {
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
RootBeanDefinition rbd = new RootBeanDefinition(GenericBean.class);
@ -387,13 +358,13 @@ class BeanFactoryGenericsTests { @@ -387,13 +358,13 @@ class BeanFactoryGenericsTests {
}
@Test
void testGenericMapWithKeyTypeConstructor() {
void genericMapWithKeyTypeConstructor() {
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
RootBeanDefinition rbd = new RootBeanDefinition(GenericBean.class);
Map<String, String> input = new HashMap<>();
input.put("4", "5");
input.put("6", "7");
Map<String, String> input = Map.of(
"4", "5",
"6", "7");
rbd.getConstructorArgumentValues().addGenericArgumentValue(input);
bf.registerBeanDefinition("genericBean", rbd);
@ -404,104 +375,88 @@ class BeanFactoryGenericsTests { @@ -404,104 +375,88 @@ class BeanFactoryGenericsTests {
}
@Test
void testGenericMapWithCollectionValueConstructor() {
void genericMapWithCollectionValueConstructor() {
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
bf.addPropertyEditorRegistrar(registry -> registry.registerCustomEditor(Number.class, new CustomNumberEditor(Integer.class, false)));
RootBeanDefinition rbd = new RootBeanDefinition(GenericBean.class);
Map<String, AbstractCollection<?>> input = new HashMap<>();
HashSet<Integer> value1 = new HashSet<>();
value1.add(1);
input.put("1", value1);
ArrayList<Boolean> value2 = new ArrayList<>();
value2.add(Boolean.TRUE);
input.put("2", value2);
Map<String, Collection<?>> input = Map.of(
"1", Set.of(1),
"2", List.of(Boolean.TRUE));
rbd.getConstructorArgumentValues().addGenericArgumentValue(Boolean.TRUE);
rbd.getConstructorArgumentValues().addGenericArgumentValue(input);
bf.registerBeanDefinition("genericBean", rbd);
GenericBean<?> gb = (GenericBean<?>) bf.getBean("genericBean");
assertThat(gb.getCollectionMap().get(1) instanceof HashSet).isTrue();
assertThat(gb.getCollectionMap().get(2) instanceof ArrayList).isTrue();
assertThat(gb.getCollectionMap().get(1)).isInstanceOf(Set.class);
assertThat(gb.getCollectionMap().get(2)).isInstanceOf(List.class);
}
@Test
void testGenericSetFactoryMethod() {
void genericSetFactoryMethod() {
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
RootBeanDefinition rbd = new RootBeanDefinition(GenericBean.class);
rbd.setFactoryMethodName("createInstance");
Set<String> input = new HashSet<>();
input.add("4");
input.add("5");
Set<String> input = Set.of("4", "5");
rbd.getConstructorArgumentValues().addGenericArgumentValue(input);
bf.registerBeanDefinition("genericBean", rbd);
GenericBean<?> gb = (GenericBean<?>) bf.getBean("genericBean");
assertThat(gb.getIntegerSet().contains(4)).isTrue();
assertThat(gb.getIntegerSet().contains(5)).isTrue();
assertThat(gb.getIntegerSet()).containsExactlyInAnyOrder(4, 5);
}
@Test
void testGenericSetListFactoryMethod() throws Exception {
void genericSetListFactoryMethod() throws Exception {
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
RootBeanDefinition rbd = new RootBeanDefinition(GenericBean.class);
rbd.setFactoryMethodName("createInstance");
Set<String> input = new HashSet<>();
input.add("4");
input.add("5");
List<String> input2 = new ArrayList<>();
input2.add("http://localhost:8080");
input2.add("http://localhost:9090");
rbd.getConstructorArgumentValues().addGenericArgumentValue(input);
Set<String> input1 = Set.of("4", "5");
List<String> input2 = List.of("http://localhost:8080", "http://localhost:9090");
rbd.getConstructorArgumentValues().addGenericArgumentValue(input1);
rbd.getConstructorArgumentValues().addGenericArgumentValue(input2);
bf.registerBeanDefinition("genericBean", rbd);
GenericBean<?> gb = (GenericBean<?>) bf.getBean("genericBean");
assertThat(gb.getIntegerSet().contains(4)).isTrue();
assertThat(gb.getIntegerSet().contains(5)).isTrue();
assertThat(gb.getResourceList().get(0)).isEqualTo(new UrlResource("http://localhost:8080"));
assertThat(gb.getResourceList().get(1)).isEqualTo(new UrlResource("http://localhost:9090"));
assertThat(gb.getIntegerSet()).containsExactlyInAnyOrder(4, 5);
assertThat(gb.getResourceList())
.containsExactly(new UrlResource("http://localhost:8080"), new UrlResource("http://localhost:9090"));
}
@Test
void testGenericSetMapFactoryMethod() {
void genericSetMapFactoryMethod() {
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
RootBeanDefinition rbd = new RootBeanDefinition(GenericBean.class);
rbd.setFactoryMethodName("createInstance");
Set<String> input = new HashSet<>();
input.add("4");
input.add("5");
Map<String, String> input2 = new HashMap<>();
input2.put("4", "5");
input2.put("6", "7");
rbd.getConstructorArgumentValues().addGenericArgumentValue(input);
Set<String> input1 = Set.of("4", "5");
Map<String, String> input2 = Map.of(
"4", "5",
"6", "7");
rbd.getConstructorArgumentValues().addGenericArgumentValue(input1);
rbd.getConstructorArgumentValues().addGenericArgumentValue(input2);
bf.registerBeanDefinition("genericBean", rbd);
GenericBean<?> gb = (GenericBean<?>) bf.getBean("genericBean");
assertThat(gb.getIntegerSet().contains(4)).isTrue();
assertThat(gb.getIntegerSet().contains(5)).isTrue();
assertThat(gb.getIntegerSet()).containsExactlyInAnyOrder(4, 5);
assertThat(gb.getShortMap().get(Short.valueOf("4"))).isEqualTo(5);
assertThat(gb.getShortMap().get(Short.valueOf("6"))).isEqualTo(7);
}
@Test
void testGenericMapResourceFactoryMethod() throws Exception {
void genericMapResourceFactoryMethod() throws Exception {
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
RootBeanDefinition rbd = new RootBeanDefinition(GenericBean.class);
rbd.setFactoryMethodName("createInstance");
Map<String, String> input = new HashMap<>();
input.put("4", "5");
input.put("6", "7");
Map<String, String> input = Map.of(
"4", "5",
"6", "7");
rbd.getConstructorArgumentValues().addGenericArgumentValue(input);
rbd.getConstructorArgumentValues().addGenericArgumentValue("http://localhost:8080");
@ -510,22 +465,22 @@ class BeanFactoryGenericsTests { @@ -510,22 +465,22 @@ class BeanFactoryGenericsTests {
assertThat(gb.getShortMap().get(Short.valueOf("4"))).isEqualTo(5);
assertThat(gb.getShortMap().get(Short.valueOf("6"))).isEqualTo(7);
assertThat(gb.getResourceList().get(0)).isEqualTo(new UrlResource("http://localhost:8080"));
assertThat(gb.getResourceList()).containsExactly(new UrlResource("http://localhost:8080"));
}
@Test
void testGenericMapMapFactoryMethod() {
void genericMapMapFactoryMethod() {
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
RootBeanDefinition rbd = new RootBeanDefinition(GenericBean.class);
rbd.setFactoryMethodName("createInstance");
Map<String, String> input = new HashMap<>();
input.put("1", "0");
input.put("2", "3");
Map<String, String> input2 = new HashMap<>();
input2.put("4", "5");
input2.put("6", "7");
rbd.getConstructorArgumentValues().addGenericArgumentValue(input);
Map<String, String> input1 = Map.of(
"1", "0",
"2", "3");
Map<String, String> input2 = Map.of(
"4", "5",
"6", "7");
rbd.getConstructorArgumentValues().addGenericArgumentValue(input1);
rbd.getConstructorArgumentValues().addGenericArgumentValue(input2);
bf.registerBeanDefinition("genericBean", rbd);
@ -538,14 +493,14 @@ class BeanFactoryGenericsTests { @@ -538,14 +493,14 @@ class BeanFactoryGenericsTests {
}
@Test
void testGenericMapWithKeyTypeFactoryMethod() {
void genericMapWithKeyTypeFactoryMethod() {
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
RootBeanDefinition rbd = new RootBeanDefinition(GenericBean.class);
rbd.setFactoryMethodName("createInstance");
Map<String, String> input = new HashMap<>();
input.put("4", "5");
input.put("6", "7");
Map<String, String> input = Map.of(
"4", "5",
"6", "7");
rbd.getConstructorArgumentValues().addGenericArgumentValue(input);
bf.registerBeanDefinition("genericBean", rbd);
@ -556,62 +511,54 @@ class BeanFactoryGenericsTests { @@ -556,62 +511,54 @@ class BeanFactoryGenericsTests {
}
@Test
void testGenericMapWithCollectionValueFactoryMethod() {
void genericMapWithCollectionValueFactoryMethod() {
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
bf.addPropertyEditorRegistrar(registry -> registry.registerCustomEditor(Number.class, new CustomNumberEditor(Integer.class, false)));
RootBeanDefinition rbd = new RootBeanDefinition(GenericBean.class);
rbd.setFactoryMethodName("createInstance");
Map<String, AbstractCollection<?>> input = new HashMap<>();
HashSet<Integer> value1 = new HashSet<>();
value1.add(1);
input.put("1", value1);
ArrayList<Boolean> value2 = new ArrayList<>();
value2.add(Boolean.TRUE);
input.put("2", value2);
Map<String, Collection<?>> input = Map.of(
"1", Set.of(1),
"2", List.of(Boolean.TRUE));
rbd.getConstructorArgumentValues().addGenericArgumentValue(Boolean.TRUE);
rbd.getConstructorArgumentValues().addGenericArgumentValue(input);
bf.registerBeanDefinition("genericBean", rbd);
GenericBean<?> gb = (GenericBean<?>) bf.getBean("genericBean");
assertThat(gb.getCollectionMap().get(1) instanceof HashSet).isTrue();
assertThat(gb.getCollectionMap().get(2) instanceof ArrayList).isTrue();
assertThat(gb.getCollectionMap().get(1)).isInstanceOf(Set.class);
assertThat(gb.getCollectionMap().get(2)).isInstanceOf(List.class);
}
@Test
void testGenericListBean() throws Exception {
void genericListBean() throws Exception {
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
new XmlBeanDefinitionReader(bf).loadBeanDefinitions(
new ClassPathResource("genericBeanTests.xml", getClass()));
List<?> list = (List<?>) bf.getBean("list");
assertThat(list).hasSize(1);
assertThat(list.get(0)).isEqualTo(new URL("http://localhost:8080"));
NamedUrlList list = bf.getBean("list", NamedUrlList.class);
assertThat(list).containsExactly(new URL("http://localhost:8080"));
}
@Test
void testGenericSetBean() throws Exception {
void genericSetBean() throws Exception {
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
new XmlBeanDefinitionReader(bf).loadBeanDefinitions(
new ClassPathResource("genericBeanTests.xml", getClass()));
Set<?> set = (Set<?>) bf.getBean("set");
assertThat(set).hasSize(1);
assertThat(set.iterator().next()).isEqualTo(new URL("http://localhost:8080"));
NamedUrlSet set = bf.getBean("set", NamedUrlSet.class);
assertThat(set).containsExactly(new URL("http://localhost:8080"));
}
@Test
void testGenericMapBean() throws Exception {
void genericMapBean() throws Exception {
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
new XmlBeanDefinitionReader(bf).loadBeanDefinitions(
new ClassPathResource("genericBeanTests.xml", getClass()));
Map<?, ?> map = (Map<?, ?>) bf.getBean("map");
assertThat(map).hasSize(1);
assertThat(map.keySet().iterator().next()).isEqualTo(10);
assertThat(map.values().iterator().next()).isEqualTo(new URL("http://localhost:8080"));
NamedUrlMap map = bf.getBean("map", NamedUrlMap.class);
assertThat(map).containsExactly(entry(10, new URL("http://localhost:8080")));
}
@Test
void testGenericallyTypedIntegerBean() {
void genericallyTypedIntegerBean() {
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
new XmlBeanDefinitionReader(bf).loadBeanDefinitions(
new ClassPathResource("genericBeanTests.xml", getClass()));
@ -622,7 +569,7 @@ class BeanFactoryGenericsTests { @@ -622,7 +569,7 @@ class BeanFactoryGenericsTests {
}
@Test
void testGenericallyTypedSetOfIntegerBean() {
void genericallyTypedSetOfIntegerBean() {
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
new XmlBeanDefinitionReader(bf).loadBeanDefinitions(
new ClassPathResource("genericBeanTests.xml", getClass()));
@ -633,14 +580,12 @@ class BeanFactoryGenericsTests { @@ -633,14 +580,12 @@ class BeanFactoryGenericsTests {
}
@Test
@EnabledForTestGroups(LONG_RUNNING)
void testSetBean() throws Exception {
void setBean() throws Exception {
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
new XmlBeanDefinitionReader(bf).loadBeanDefinitions(
new ClassPathResource("genericBeanTests.xml", getClass()));
UrlSet us = (UrlSet) bf.getBean("setBean");
assertThat(us).hasSize(1);
assertThat(us.iterator().next()).isEqualTo(new URL("https://www.springframework.org"));
UrlSet urlSet = bf.getBean("setBean", UrlSet.class);
assertThat(urlSet).containsExactly(new URL("https://www.springframework.org"));
}
/**
@ -801,7 +746,7 @@ class BeanFactoryGenericsTests { @@ -801,7 +746,7 @@ class BeanFactoryGenericsTests {
}
@Test
void testGenericMatchingWithBeanNameDifferentiation() {
void genericMatchingWithBeanNameDifferentiation() {
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
bf.setAutowireCandidateResolver(new GenericTypeAwareAutowireCandidateResolver());
@ -817,15 +762,13 @@ class BeanFactoryGenericsTests { @@ -817,15 +762,13 @@ class BeanFactoryGenericsTests {
String[] numberStoreNames = bf.getBeanNamesForType(ResolvableType.forClass(NumberStore.class));
String[] doubleStoreNames = bf.getBeanNamesForType(ResolvableType.forClassWithGenerics(NumberStore.class, Double.class));
String[] floatStoreNames = bf.getBeanNamesForType(ResolvableType.forClassWithGenerics(NumberStore.class, Float.class));
assertThat(numberStoreNames).hasSize(2);
assertThat(numberStoreNames[0]).isEqualTo("doubleStore");
assertThat(numberStoreNames[1]).isEqualTo("floatStore");
assertThat(numberStoreNames).containsExactly("doubleStore", "floatStore");
assertThat(doubleStoreNames).isEmpty();
assertThat(floatStoreNames).isEmpty();
}
@Test
void testGenericMatchingWithFullTypeDifferentiation() {
void genericMatchingWithFullTypeDifferentiation() {
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
bf.setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE);
bf.setAutowireCandidateResolver(new GenericTypeAwareAutowireCandidateResolver());
@ -846,13 +789,9 @@ class BeanFactoryGenericsTests { @@ -846,13 +789,9 @@ class BeanFactoryGenericsTests {
String[] numberStoreNames = bf.getBeanNamesForType(ResolvableType.forClass(NumberStore.class));
String[] doubleStoreNames = bf.getBeanNamesForType(ResolvableType.forClassWithGenerics(NumberStore.class, Double.class));
String[] floatStoreNames = bf.getBeanNamesForType(ResolvableType.forClassWithGenerics(NumberStore.class, Float.class));
assertThat(numberStoreNames).hasSize(2);
assertThat(numberStoreNames[0]).isEqualTo("store1");
assertThat(numberStoreNames[1]).isEqualTo("store2");
assertThat(doubleStoreNames).hasSize(1);
assertThat(doubleStoreNames[0]).isEqualTo("store1");
assertThat(floatStoreNames).hasSize(1);
assertThat(floatStoreNames[0]).isEqualTo("store2");
assertThat(numberStoreNames).containsExactly("store1", "store2");
assertThat(doubleStoreNames).containsExactly("store1");
assertThat(floatStoreNames).containsExactly("store2");
ObjectProvider<NumberStore<?>> numberStoreProvider = bf.getBeanProvider(ResolvableType.forClass(NumberStore.class));
ObjectProvider<NumberStore<Double>> doubleStoreProvider = bf.getBeanProvider(ResolvableType.forClassWithGenerics(NumberStore.class, Double.class));
@ -889,35 +828,29 @@ class BeanFactoryGenericsTests { @@ -889,35 +828,29 @@ class BeanFactoryGenericsTests {
for (NumberStore<Double> instance : doubleStoreProvider) {
resolved.add(instance);
}
assertThat(resolved).hasSize(1);
assertThat(resolved.contains(bf.getBean("store1"))).isTrue();
assertThat(resolved).containsExactly(bf.getBean("store1", NumberStore.class));
resolved = doubleStoreProvider.stream().collect(Collectors.toList());
assertThat(resolved).hasSize(1);
assertThat(resolved.contains(bf.getBean("store1"))).isTrue();
assertThat(resolved).containsExactly(bf.getBean("store1", NumberStore.class));
resolved = doubleStoreProvider.orderedStream().collect(Collectors.toList());
assertThat(resolved).hasSize(1);
assertThat(resolved.contains(bf.getBean("store1"))).isTrue();
assertThat(resolved).containsExactly(bf.getBean("store1", NumberStore.class));
resolved = new ArrayList<>();
for (NumberStore<Float> instance : floatStoreProvider) {
resolved.add(instance);
}
assertThat(resolved).hasSize(1);
assertThat(resolved.contains(bf.getBean("store2"))).isTrue();
assertThat(resolved).containsExactly(bf.getBean("store2", NumberStore.class));
resolved = floatStoreProvider.stream().collect(Collectors.toList());
assertThat(resolved).hasSize(1);
assertThat(resolved.contains(bf.getBean("store2"))).isTrue();
assertThat(resolved).containsExactly(bf.getBean("store2", NumberStore.class));
resolved = floatStoreProvider.orderedStream().collect(Collectors.toList());
assertThat(resolved).hasSize(1);
assertThat(resolved.contains(bf.getBean("store2"))).isTrue();
assertThat(resolved).containsExactly(bf.getBean("store2", NumberStore.class));
}
@Test
void testGenericMatchingWithUnresolvedOrderedStream() {
void genericMatchingWithUnresolvedOrderedStream() {
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
bf.setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE);
bf.setAutowireCandidateResolver(new GenericTypeAwareAutowireCandidateResolver());
@ -999,7 +932,7 @@ class BeanFactoryGenericsTests { @@ -999,7 +932,7 @@ class BeanFactoryGenericsTests {
@SuppressWarnings("unchecked")
public <T> T createMock(Class<T> toMock) {
return (T) Proxy.newProxyInstance(BeanFactoryGenericsTests.class.getClassLoader(), new Class<?>[] {toMock},
(InvocationHandler) (proxy, method, args) -> {
(proxy, method, args) -> {
throw new UnsupportedOperationException("mocked!");
});
}

64
spring-beans/src/test/resources/org/springframework/beans/factory/support/genericBeanTests.xml

@ -15,56 +15,54 @@ @@ -15,56 +15,54 @@
</bean>
<bean id="list" class="org.springframework.beans.factory.config.ListFactoryBean">
<property name="sourceList" value="http://localhost:8080"/>
<property name="targetListClass" value="org.springframework.beans.factory.support.BeanFactoryGenericsTests$NamedUrlList"/>
<property name="sourceList" value="http://localhost:8080" />
<property name="targetListClass" value="org.springframework.beans.factory.support.BeanFactoryGenericsTests$NamedUrlList" />
</bean>
<bean id="set" class="org.springframework.beans.factory.config.SetFactoryBean">
<property name="sourceSet" value="http://localhost:8080"/>
<property name="targetSetClass" value="org.springframework.beans.factory.support.BeanFactoryGenericsTests$NamedUrlSet"/>
<property name="sourceSet" value="http://localhost:8080" />
<property name="targetSetClass" value="org.springframework.beans.factory.support.BeanFactoryGenericsTests$NamedUrlSet" />
</bean>
<bean id="map" class="org.springframework.beans.factory.config.MapFactoryBean">
<property name="sourceMap">
<map>
<entry key="10" value="http://localhost:8080"/>
<entry key="10" value="http://localhost:8080" />
</map>
</property>
<property name="targetMapClass" value="org.springframework.beans.factory.support.BeanFactoryGenericsTests$NamedUrlMap"/>
<property name="targetMapClass" value="org.springframework.beans.factory.support.BeanFactoryGenericsTests$NamedUrlMap" />
</bean>
<bean class="org.springframework.beans.factory.support.BeanFactoryGenericsTests$CollectionDependentBean">
<constructor-arg ref="list"/>
<constructor-arg ref="set"/>
<constructor-arg ref="map"/>
<constructor-arg ref="list" />
<constructor-arg ref="set" />
<constructor-arg ref="map" />
</bean>
<bean class="org.springframework.beans.factory.support.BeanFactoryGenericsTests$CollectionDependentBean"
autowire="constructor">
</bean>
<bean class="org.springframework.beans.factory.support.BeanFactoryGenericsTests$CollectionDependentBean" autowire="constructor" />
<bean id="integerBean" class="org.springframework.beans.testfixture.beans.GenericIntegerBean">
<property name="genericProperty" value="10"/>
<property name="genericListProperty">
<list>
<value>20</value>
<value>30</value>
</list>
</property>
</bean>
<bean id="integerBean" class="org.springframework.beans.testfixture.beans.GenericIntegerBean">
<property name="genericProperty" value="10" />
<property name="genericListProperty">
<list>
<value>20</value>
<value>30</value>
</list>
</property>
</bean>
<bean id="setOfIntegerBean" class="org.springframework.beans.testfixture.beans.GenericSetOfIntegerBean">
<property name="genericProperty" value="10"/>
<property name="genericListProperty">
<list>
<value>20</value>
<value>30</value>
</list>
</property>
</bean>
<bean id="setOfIntegerBean" class="org.springframework.beans.testfixture.beans.GenericSetOfIntegerBean">
<property name="genericProperty" value="10" />
<property name="genericListProperty">
<list>
<value>20</value>
<value>30</value>
</list>
</property>
</bean>
<bean id="setBean" class="org.springframework.beans.factory.support.BeanFactoryGenericsTests$UrlSet">
<property name="urlNames" value="https://www.springframework.org"/>
</bean>
<bean id="setBean" class="org.springframework.beans.factory.support.BeanFactoryGenericsTests$UrlSet">
<property name="urlNames" value="https://www.springframework.org" />
</bean>
</beans>

Loading…
Cancel
Save