Refine inner-class test @Configuration detection
Update detection logic to also consider `@Rules` classes. Also make the documentation a little clearer. Fixes gh-6768
This commit is contained in:
@@ -4918,8 +4918,8 @@ annotations that can be used on classes in `src/test/java` to indicate that they
|
||||
not be picked up by scanning.
|
||||
|
||||
NOTE: `@TestComponent` and `@TestConfiguration` are only needed on top level classes. If
|
||||
you define `@Configuration` or `@Component` as inner-classes within a test, they will be
|
||||
automatically filtered.
|
||||
you define `@Configuration` or `@Component` as inner-classes within a test (any class
|
||||
that has `@Test` methods or `@RunWith`), they will be automatically filtered.
|
||||
|
||||
NOTE: If you directly use `@ComponentScan` (i.e. not via `@SpringBootApplication`) you
|
||||
will need to register the `TypeExcludeFilter` with it. See
|
||||
|
||||
@@ -31,7 +31,9 @@ import org.springframework.core.type.classreading.MetadataReaderFactory;
|
||||
*/
|
||||
class TestTypeExcludeFilter extends TypeExcludeFilter {
|
||||
|
||||
private static final String TEST_ANNOTATION = "org.junit.Test";
|
||||
private static final String[] CLASS_ANNOTATIONS = { "org.junit.runner.RunWith" };
|
||||
|
||||
private static final String[] METHOD_ANNOTATIONS = { "org.junit.Test" };
|
||||
|
||||
@Override
|
||||
public boolean match(MetadataReader metadataReader,
|
||||
@@ -63,8 +65,18 @@ class TestTypeExcludeFilter extends TypeExcludeFilter {
|
||||
}
|
||||
|
||||
private boolean isTestClass(MetadataReader metadataReader) {
|
||||
return !metadataReader.getAnnotationMetadata()
|
||||
.getAnnotatedMethods(TEST_ANNOTATION).isEmpty();
|
||||
for (String annotation : CLASS_ANNOTATIONS) {
|
||||
if (metadataReader.getAnnotationMetadata().hasAnnotation(annotation)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
for (String annotation : METHOD_ANNOTATIONS) {
|
||||
if (metadataReader.getAnnotationMetadata().hasAnnotatedMethods(annotation)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* Copyright 2012-2016 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.test.context.filter;
|
||||
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.test.context.junit4.SpringRunner;
|
||||
|
||||
/**
|
||||
* Abstract test with nest {@code @Configuration} and {@code @RunWith} used by
|
||||
* {@link TestTypeExcludeFilter}.
|
||||
*
|
||||
* @author Phillip Webb
|
||||
*/
|
||||
@RunWith(SpringRunner.class)
|
||||
public abstract class AbstractTestWithConfigAndRunWith {
|
||||
|
||||
@Configuration
|
||||
static class Config {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -50,6 +50,14 @@ public class TestTypeExcludeFilterTests {
|
||||
this.metadataReaderFactory)).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void matchesNestedConfigurationClassWithoutTestMethodsIfItHasRunWith()
|
||||
throws Exception {
|
||||
assertThat(this.filter.match(
|
||||
getMetadataReader(AbstractTestWithConfigAndRunWith.Config.class),
|
||||
this.metadataReaderFactory)).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void matchesTestConfiguration() throws Exception {
|
||||
assertThat(this.filter.match(getMetadataReader(SampleTestConfig.class),
|
||||
|
||||
Reference in New Issue
Block a user