Merge branch '2.2.x' into 2.3.x

Closes gh-22006
This commit is contained in:
Madhura Bhave
2020-06-17 17:26:40 -07:00
3 changed files with 122 additions and 11 deletions

View File

@@ -60,20 +60,20 @@ class DefinitionsParser {
}
void parse(Class<?> source) {
parseElement(source);
ReflectionUtils.doWithFields(source, this::parseElement);
parseElement(source, null);
ReflectionUtils.doWithFields(source, (element) -> parseElement(element, source));
}
private void parseElement(AnnotatedElement element) {
private void parseElement(AnnotatedElement element, Class<?> source) {
MergedAnnotations annotations = MergedAnnotations.from(element, SearchStrategy.SUPERCLASS);
annotations.stream(MockBean.class).map(MergedAnnotation::synthesize)
.forEach((annotation) -> parseMockBeanAnnotation(annotation, element));
.forEach((annotation) -> parseMockBeanAnnotation(annotation, element, source));
annotations.stream(SpyBean.class).map(MergedAnnotation::synthesize)
.forEach((annotation) -> parseSpyBeanAnnotation(annotation, element));
.forEach((annotation) -> parseSpyBeanAnnotation(annotation, element, source));
}
private void parseMockBeanAnnotation(MockBean annotation, AnnotatedElement element) {
Set<ResolvableType> typesToMock = getOrDeduceTypes(element, annotation.value());
private void parseMockBeanAnnotation(MockBean annotation, AnnotatedElement element, Class<?> source) {
Set<ResolvableType> typesToMock = getOrDeduceTypes(element, annotation.value(), source);
Assert.state(!typesToMock.isEmpty(), () -> "Unable to deduce type to mock from " + element);
if (StringUtils.hasLength(annotation.name())) {
Assert.state(typesToMock.size() == 1, "The name attribute can only be used when mocking a single class");
@@ -86,8 +86,8 @@ class DefinitionsParser {
}
}
private void parseSpyBeanAnnotation(SpyBean annotation, AnnotatedElement element) {
Set<ResolvableType> typesToSpy = getOrDeduceTypes(element, annotation.value());
private void parseSpyBeanAnnotation(SpyBean annotation, AnnotatedElement element, Class<?> source) {
Set<ResolvableType> typesToSpy = getOrDeduceTypes(element, annotation.value(), source);
Assert.state(!typesToSpy.isEmpty(), () -> "Unable to deduce type to spy from " + element);
if (StringUtils.hasLength(annotation.name())) {
Assert.state(typesToSpy.size() == 1, "The name attribute can only be used when spying a single class");
@@ -108,13 +108,13 @@ class DefinitionsParser {
}
}
private Set<ResolvableType> getOrDeduceTypes(AnnotatedElement element, Class<?>[] value) {
private Set<ResolvableType> getOrDeduceTypes(AnnotatedElement element, Class<?>[] value, Class<?> source) {
Set<ResolvableType> types = new LinkedHashSet<>();
for (Class<?> clazz : value) {
types.add(ResolvableType.forClass(clazz));
}
if (types.isEmpty() && element instanceof Field) {
types.add(ResolvableType.forField((Field) element));
types.add(ResolvableType.forField((Field) element, source));
}
return types;
}