mirror of
https://github.com/spring-projects/spring-boot.git
synced 2024-08-29 03:06:45 +08:00
Ignore Spock annotations when creating test context cache key
Closes gh-7524
This commit is contained in:
parent
c51d836a15
commit
45d672f5b3
@ -112,21 +112,11 @@
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
<!-- Test -->
|
||||
<dependency>
|
||||
<groupId>org.jetbrains.kotlin</groupId>
|
||||
<artifactId>kotlin-runtime</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.tomcat.embed</groupId>
|
||||
<artifactId>tomcat-embed-core</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-webmvc</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.codehaus.groovy</groupId>
|
||||
<artifactId>groovy</artifactId>
|
||||
@ -138,6 +128,20 @@
|
||||
<optional>true</optional>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jetbrains.kotlin</groupId>
|
||||
<artifactId>kotlin-runtime</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.spockframework</groupId>
|
||||
<artifactId>spock-core</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-webmvc</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<build>
|
||||
<plugins>
|
||||
|
@ -214,6 +214,16 @@ class ImportsContextCustomizer implements ContextCustomizer {
|
||||
*/
|
||||
static class ContextCustomizerKey {
|
||||
|
||||
private static final Set<AnnotationFilter> ANNOTATION_FILTERS;
|
||||
|
||||
static {
|
||||
Set<AnnotationFilter> filters = new HashSet<AnnotationFilter>();
|
||||
filters.add(new JavaLangAnnotationFilter());
|
||||
filters.add(new KotlinAnnotationFilter());
|
||||
filters.add(new SpockAnnotationFilter());
|
||||
ANNOTATION_FILTERS = Collections.unmodifiableSet(filters);
|
||||
}
|
||||
|
||||
private final Set<Annotation> annotations;
|
||||
|
||||
ContextCustomizerKey(Class<?> testClass) {
|
||||
@ -239,8 +249,7 @@ class ImportsContextCustomizer implements ContextCustomizer {
|
||||
private void collectElementAnnotations(AnnotatedElement element,
|
||||
Set<Annotation> annotations, Set<Class<?>> seen) {
|
||||
for (Annotation annotation : element.getDeclaredAnnotations()) {
|
||||
if (!AnnotationUtils.isInJavaLangAnnotationPackage(annotation)
|
||||
&& !isIgnoredKotlinAnnotation(annotation)) {
|
||||
if (!isIgnoredAnnotation(annotation)) {
|
||||
annotations.add(annotation);
|
||||
collectClassAnnotations(annotation.annotationType(), annotations,
|
||||
seen);
|
||||
@ -248,13 +257,13 @@ class ImportsContextCustomizer implements ContextCustomizer {
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isIgnoredKotlinAnnotation(Annotation annotation) {
|
||||
return "kotlin.Metadata".equals(annotation.annotationType().getName())
|
||||
|| isInKotlinAnnotationPackage(annotation);
|
||||
}
|
||||
|
||||
private boolean isInKotlinAnnotationPackage(Annotation annotation) {
|
||||
return annotation.annotationType().getName().startsWith("kotlin.annotation.");
|
||||
private boolean isIgnoredAnnotation(Annotation annotation) {
|
||||
for (AnnotationFilter annotationFilter : ANNOTATION_FILTERS) {
|
||||
if (annotationFilter.isIgnored(annotation)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -268,6 +277,46 @@ class ImportsContextCustomizer implements ContextCustomizer {
|
||||
&& this.annotations.equals(((ContextCustomizerKey) obj).annotations));
|
||||
}
|
||||
|
||||
private interface AnnotationFilter {
|
||||
|
||||
boolean isIgnored(Annotation annotation);
|
||||
|
||||
}
|
||||
|
||||
private static final class JavaLangAnnotationFilter implements AnnotationFilter {
|
||||
|
||||
@Override
|
||||
public boolean isIgnored(Annotation annotation) {
|
||||
return AnnotationUtils.isInJavaLangAnnotationPackage(annotation);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static final class KotlinAnnotationFilter implements AnnotationFilter {
|
||||
|
||||
@Override
|
||||
public boolean isIgnored(Annotation annotation) {
|
||||
return "kotlin.Metadata".equals(annotation.annotationType().getName())
|
||||
|| isInKotlinAnnotationPackage(annotation);
|
||||
}
|
||||
|
||||
private boolean isInKotlinAnnotationPackage(Annotation annotation) {
|
||||
return annotation.annotationType().getName()
|
||||
.startsWith("kotlin.annotation.");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static final class SpockAnnotationFilter implements AnnotationFilter {
|
||||
|
||||
@Override
|
||||
public boolean isIgnored(Annotation annotation) {
|
||||
return annotation.annotationType().getName()
|
||||
.startsWith("org.spockframework.");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -18,6 +18,7 @@ package org.springframework.boot.test.context;
|
||||
|
||||
import kotlin.Metadata;
|
||||
import org.junit.Test;
|
||||
import org.spockframework.runtime.model.SpecMetadata;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
@ -35,6 +36,13 @@ public class ImportsContextCustomizerTests {
|
||||
SecondKotlinAnnotatedTestClass.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void customizersForTestClassesWithDifferentSpockMetadataAreEqual() {
|
||||
assertThat(new ImportsContextCustomizer(FirstSpockAnnotatedTestClass.class))
|
||||
.isEqualTo(new ImportsContextCustomizer(
|
||||
SecondSpockAnnotatedTestClass.class));
|
||||
}
|
||||
|
||||
@Metadata(d2 = "foo")
|
||||
static class FirstKotlinAnnotatedTestClass {
|
||||
|
||||
@ -45,4 +53,14 @@ public class ImportsContextCustomizerTests {
|
||||
|
||||
}
|
||||
|
||||
@SpecMetadata(filename = "foo", line = 10)
|
||||
static class FirstSpockAnnotatedTestClass {
|
||||
|
||||
}
|
||||
|
||||
@SpecMetadata(filename = "bar", line = 10)
|
||||
static class SecondSpockAnnotatedTestClass {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user