diff --git a/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc b/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc index 46b6481712..f9ecaef4b5 100644 --- a/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc +++ b/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc @@ -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 diff --git a/spring-boot-test/src/main/java/org/springframework/boot/test/context/filter/TestTypeExcludeFilter.java b/spring-boot-test/src/main/java/org/springframework/boot/test/context/filter/TestTypeExcludeFilter.java index 2a10438e37..803436ca73 100644 --- a/spring-boot-test/src/main/java/org/springframework/boot/test/context/filter/TestTypeExcludeFilter.java +++ b/spring-boot-test/src/main/java/org/springframework/boot/test/context/filter/TestTypeExcludeFilter.java @@ -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; } } diff --git a/spring-boot-test/src/test/java/org/springframework/boot/test/context/filter/AbstractTestWithConfigAndRunWith.java b/spring-boot-test/src/test/java/org/springframework/boot/test/context/filter/AbstractTestWithConfigAndRunWith.java new file mode 100644 index 0000000000..a975c6d78f --- /dev/null +++ b/spring-boot-test/src/test/java/org/springframework/boot/test/context/filter/AbstractTestWithConfigAndRunWith.java @@ -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 { + + } + +} diff --git a/spring-boot-test/src/test/java/org/springframework/boot/test/context/filter/TestTypeExcludeFilterTests.java b/spring-boot-test/src/test/java/org/springframework/boot/test/context/filter/TestTypeExcludeFilterTests.java index ee1b685576..38e555e584 100644 --- a/spring-boot-test/src/test/java/org/springframework/boot/test/context/filter/TestTypeExcludeFilterTests.java +++ b/spring-boot-test/src/test/java/org/springframework/boot/test/context/filter/TestTypeExcludeFilterTests.java @@ -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),