From de0bcaa50eec09c99941aebdc924ca64e7d860bd Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Tue, 10 May 2016 10:41:38 +0100 Subject: [PATCH] Update WebMvcTest to auto-configure supported template engines Closes gh-5801 --- .../src/checkstyle/checkstyle.xml | 2 +- .../web/servlet/AutoConfigureWebMvc.java | 9 ++- .../AutoConfigurationImportedCondition.java | 61 ++++++++++++++++ .../orm/jpa/DataJpaTestIntegrationTests.java | 17 ++--- ...TestAutoConfigurationIntegrationTests.java | 69 +++++++++++++++++++ 5 files changed, 144 insertions(+), 14 deletions(-) create mode 100644 spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/AutoConfigurationImportedCondition.java create mode 100644 spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/WebMvcTestAutoConfigurationIntegrationTests.java diff --git a/spring-boot-parent/src/checkstyle/checkstyle.xml b/spring-boot-parent/src/checkstyle/checkstyle.xml index 32cc2a1bf1..fc172835c4 100644 --- a/spring-boot-parent/src/checkstyle/checkstyle.xml +++ b/spring-boot-parent/src/checkstyle/checkstyle.xml @@ -71,7 +71,7 @@ + value="org.assertj.core.api.Assertions.*, org.junit.Assert.*, org.junit.Assume.*, org.junit.internal.matchers.ThrowableMessageMatcher.*, org.hamcrest.CoreMatchers.*, org.hamcrest.Matchers.*, org.springframework.boot.configurationprocessor.ConfigurationMetadataMatchers.*, org.springframework.boot.configurationprocessor.TestCompiler.*, org.springframework.boot.test.autoconfigure.AutoConfigurationImportedCondition.*, org.mockito.Mockito.*, org.mockito.BDDMockito.*, org.mockito.Matchers.*, org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.*, org.springframework.restdocs.hypermedia.HypermediaDocumentation.*, org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*, org.springframework.test.web.servlet.result.MockMvcResultMatchers.*, org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.*, org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.*, org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo" /> diff --git a/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/servlet/AutoConfigureWebMvc.java b/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/servlet/AutoConfigureWebMvc.java index 2c5f3b4adc..9857774bdc 100644 --- a/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/servlet/AutoConfigureWebMvc.java +++ b/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/servlet/AutoConfigureWebMvc.java @@ -23,8 +23,12 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import org.springframework.boot.autoconfigure.ImportAutoConfiguration; +import org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration; +import org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration; import org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration; import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration; +import org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration; +import org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration; import org.springframework.boot.autoconfigure.web.HttpMessageConvertersAutoConfiguration; import org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration; @@ -34,6 +38,7 @@ import org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration; * using this annotation directly. * * @author Phillip Webb + * @author Andy Wilkinson * @since 1.4.0 * @see WebMvcTest */ @@ -41,7 +46,9 @@ import org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration; @Retention(RetentionPolicy.RUNTIME) @Documented @ImportAutoConfiguration({ WebMvcAutoConfiguration.class, GsonAutoConfiguration.class, - JacksonAutoConfiguration.class, HttpMessageConvertersAutoConfiguration.class }) + JacksonAutoConfiguration.class, HttpMessageConvertersAutoConfiguration.class, + FreeMarkerAutoConfiguration.class, GroovyTemplateAutoConfiguration.class, + MustacheAutoConfiguration.class, ThymeleafAutoConfiguration.class }) public @interface AutoConfigureWebMvc { } diff --git a/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/AutoConfigurationImportedCondition.java b/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/AutoConfigurationImportedCondition.java new file mode 100644 index 0000000000..39fd8938c7 --- /dev/null +++ b/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/AutoConfigurationImportedCondition.java @@ -0,0 +1,61 @@ +/* + * 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.autoconfigure; + +import org.assertj.core.api.Condition; +import org.assertj.core.description.TextDescription; + +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.boot.autoconfigure.condition.ConditionEvaluationReport; +import org.springframework.context.ApplicationContext; + +/** + * AssertJ {@link Condition} that checks that an auto-configuration has been imported. + * + * @author Andy Wilkinson + */ +public final class AutoConfigurationImportedCondition + extends Condition { + + private final Class autoConfigurationClass; + + private AutoConfigurationImportedCondition(Class autoConfigurationClass) { + super(new TextDescription("%s imported", autoConfigurationClass.getName())); + this.autoConfigurationClass = autoConfigurationClass; + } + + @Override + public boolean matches(ApplicationContext context) { + ConditionEvaluationReport report = ConditionEvaluationReport + .get((ConfigurableListableBeanFactory) context + .getAutowireCapableBeanFactory()); + return report.getConditionAndOutcomesBySource().keySet() + .contains(this.autoConfigurationClass.getName()); + } + + /** + * Returns a {@link Condition} that verifies that the given + * {@code autoConfigurationClass} has been imported. + * @param autoConfigurationClass the auto-configuration class + * @return the condition + */ + public static AutoConfigurationImportedCondition importedAutoConfiguration( + Class autoConfigurationClass) { + return new AutoConfigurationImportedCondition(autoConfigurationClass); + } + +} diff --git a/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/orm/jpa/DataJpaTestIntegrationTests.java b/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/orm/jpa/DataJpaTestIntegrationTests.java index e9e29cddcb..d712f7d551 100644 --- a/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/orm/jpa/DataJpaTestIntegrationTests.java +++ b/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/orm/jpa/DataJpaTestIntegrationTests.java @@ -25,14 +25,13 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; -import org.springframework.boot.autoconfigure.condition.ConditionEvaluationReport; import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration; import org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration; import org.springframework.context.ApplicationContext; import org.springframework.test.context.junit4.SpringRunner; import static org.assertj.core.api.Assertions.assertThat; +import static org.springframework.boot.test.autoconfigure.AutoConfigurationImportedCondition.importedAutoConfiguration; /** * Integration tests for {@link DataJpaTest}. @@ -99,20 +98,14 @@ public class DataJpaTestIntegrationTests { @Test public void flywayAutoConfigurationWasImported() { - ConditionEvaluationReport report = ConditionEvaluationReport - .get((ConfigurableListableBeanFactory) this.applicationContext - .getAutowireCapableBeanFactory()); - assertThat(report.getConditionAndOutcomesBySource().keySet()) - .contains(FlywayAutoConfiguration.class.getName()); + assertThat(this.applicationContext) + .has(importedAutoConfiguration(FlywayAutoConfiguration.class)); } @Test public void liquibaseAutoConfigurationWasImported() { - ConditionEvaluationReport report = ConditionEvaluationReport - .get((ConfigurableListableBeanFactory) this.applicationContext - .getAutowireCapableBeanFactory()); - assertThat(report.getConditionAndOutcomesBySource().keySet()) - .contains(LiquibaseAutoConfiguration.class.getName()); + assertThat(this.applicationContext) + .has(importedAutoConfiguration(LiquibaseAutoConfiguration.class)); } } diff --git a/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/WebMvcTestAutoConfigurationIntegrationTests.java b/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/WebMvcTestAutoConfigurationIntegrationTests.java new file mode 100644 index 0000000000..a479c9fdc8 --- /dev/null +++ b/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/WebMvcTestAutoConfigurationIntegrationTests.java @@ -0,0 +1,69 @@ +/* + * 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.autoconfigure.web.servlet; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration; +import org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration; +import org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration; +import org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration; +import org.springframework.context.ApplicationContext; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.springframework.boot.test.autoconfigure.AutoConfigurationImportedCondition.importedAutoConfiguration; + +/** + * Tests for the auto-configuration imported by {@link WebMvcTest}. + * + * @author Andy Wilkinson + */ +@RunWith(SpringRunner.class) +@WebMvcTest +public class WebMvcTestAutoConfigurationIntegrationTests { + + @Autowired + private ApplicationContext applicationContext; + + @Test + public void freemarkerAutoConfigurationWasImported() { + assertThat(this.applicationContext) + .has(importedAutoConfiguration(FreeMarkerAutoConfiguration.class)); + } + + @Test + public void groovyTemplatesAutoConfigurationWasImported() { + assertThat(this.applicationContext) + .has(importedAutoConfiguration(GroovyTemplateAutoConfiguration.class)); + } + + @Test + public void mustacheAutoConfigurationWasImported() { + assertThat(this.applicationContext) + .has(importedAutoConfiguration(MustacheAutoConfiguration.class)); + } + + @Test + public void thymeleafAutoConfigurationWasImported() { + assertThat(this.applicationContext) + .has(importedAutoConfiguration(ThymeleafAutoConfiguration.class)); + } + +}