From 0aa0fd0670a1d03766629975ef638abfcad45c8c Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Fri, 23 Jun 2017 14:37:54 -0700 Subject: [PATCH] Ensure that Jackson and GSON are auto-configured by @AutoConfigureJsonTesters Previously, @AutoConfigureJsonTesters only imported JsonTestersAutoConfiguration and relied on something else pulling in the Jackson and GSON auto-configuration upon which it depends. This worked with @JsonTest which imported those auto-configurations. It did not work with @SpringBootTest which would use @EnableAutoConfiguration and the ordering was then wrong and JsonTestersAutoConfiguration would be processed before the Jackson and GSON auto-configurations had a chance to create the beans that JsonTestersAutoConfiguration needs. This commit updates the spring.factories configuration for JsonTestersAutoConfiguration so that it imports JacksonAutoConfiguration and GsonAutoConfiguration. Appropriate @AutoConfigureAfter has also been added to JsonTestersAutoConfiguration to ensure that it is considered after JacksonAutoConfiguration and GsonAutoConfiguration. Lastly, ExampleJsonApplication and associated classes have been moved into an app sub-package to prevent its component scanning from pulling in JsonTestersAutoConfiguration as if it were user configuration. Closes gh-9515 --- .../json/JsonTestersAutoConfiguration.java | 6 ++- .../main/resources/META-INF/spring.factories | 4 +- .../json/JsonTestIntegrationTests.java | 6 +++ ...TestWithAutoConfigureJsonTestersTests.java | 3 +- ...TestWithAutoConfigureJsonTestersTests.java | 54 +++++++++++++++++++ .../json/{ => app}/ExampleBasicObject.java | 4 +- .../json/{ => app}/ExampleCustomObject.java | 4 +- .../{ => app}/ExampleJsonApplication.java | 5 +- .../json/{ => app}/ExampleJsonComponent.java | 5 +- .../{ => app}/ExampleJsonObjectWithView.java | 4 +- 10 files changed, 82 insertions(+), 13 deletions(-) create mode 100644 spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/json/SpringBootTestWithAutoConfigureJsonTestersTests.java rename spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/json/{ => app}/ExampleBasicObject.java (90%) rename spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/json/{ => app}/ExampleCustomObject.java (90%) rename spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/json/{ => app}/ExampleJsonApplication.java (82%) rename spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/json/{ => app}/ExampleJsonComponent.java (91%) rename spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/json/{ => app}/ExampleJsonObjectWithView.java (94%) diff --git a/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/json/JsonTestersAutoConfiguration.java b/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/json/JsonTestersAutoConfiguration.java index a73c0092cf..3adc86f2d1 100644 --- a/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/json/JsonTestersAutoConfiguration.java +++ b/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/json/JsonTestersAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2016 the original author or authors. + * Copyright 2012-2017 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. @@ -27,9 +27,12 @@ import org.springframework.beans.BeansException; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessorAdapter; +import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration; +import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration; import org.springframework.boot.test.json.AbstractJsonMarshalTester; import org.springframework.boot.test.json.BasicJsonTester; import org.springframework.boot.test.json.GsonTester; @@ -52,6 +55,7 @@ import org.springframework.util.ReflectionUtils.FieldCallback; @Configuration @ConditionalOnClass(name = "org.assertj.core.api.Assert") @ConditionalOnProperty("spring.test.jsontesters.enabled") +@AutoConfigureAfter({ JacksonAutoConfiguration.class, GsonAutoConfiguration.class }) public class JsonTestersAutoConfiguration { @Bean diff --git a/spring-boot-test-autoconfigure/src/main/resources/META-INF/spring.factories b/spring-boot-test-autoconfigure/src/main/resources/META-INF/spring.factories index 9d022f55f9..9c57a215d0 100644 --- a/spring-boot-test-autoconfigure/src/main/resources/META-INF/spring.factories +++ b/spring-boot-test-autoconfigure/src/main/resources/META-INF/spring.factories @@ -41,7 +41,9 @@ org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration # AutoConfigureJsonTesters auto-configuration imports org.springframework.boot.test.autoconfigure.json.AutoConfigureJsonTesters=\ -org.springframework.boot.test.autoconfigure.json.JsonTestersAutoConfiguration +org.springframework.boot.test.autoconfigure.json.JsonTestersAutoConfiguration,\ +org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration,\ +org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration # AutoConfigureMockMvc auto-configuration imports org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc=\ diff --git a/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/json/JsonTestIntegrationTests.java b/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/json/JsonTestIntegrationTests.java index cf1fb09915..64dbb108ba 100644 --- a/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/json/JsonTestIntegrationTests.java +++ b/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/json/JsonTestIntegrationTests.java @@ -20,10 +20,15 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.json.app.ExampleBasicObject; +import org.springframework.boot.test.autoconfigure.json.app.ExampleCustomObject; +import org.springframework.boot.test.autoconfigure.json.app.ExampleJsonApplication; +import org.springframework.boot.test.autoconfigure.json.app.ExampleJsonObjectWithView; import org.springframework.boot.test.json.BasicJsonTester; import org.springframework.boot.test.json.GsonTester; import org.springframework.boot.test.json.JacksonTester; import org.springframework.boot.test.json.JsonContent; +import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringRunner; import static org.assertj.core.api.Assertions.assertThat; @@ -36,6 +41,7 @@ import static org.assertj.core.api.Assertions.assertThat; */ @RunWith(SpringRunner.class) @JsonTest +@ContextConfiguration(classes = ExampleJsonApplication.class) public class JsonTestIntegrationTests { @Autowired diff --git a/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/json/JsonTestWithAutoConfigureJsonTestersTests.java b/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/json/JsonTestWithAutoConfigureJsonTestersTests.java index 06a7414676..99006d90cc 100644 --- a/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/json/JsonTestWithAutoConfigureJsonTestersTests.java +++ b/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/json/JsonTestWithAutoConfigureJsonTestersTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2016 the original author or authors. + * Copyright 2012-2017 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. @@ -20,6 +20,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.json.app.ExampleBasicObject; import org.springframework.boot.test.json.BasicJsonTester; import org.springframework.boot.test.json.GsonTester; import org.springframework.boot.test.json.JacksonTester; diff --git a/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/json/SpringBootTestWithAutoConfigureJsonTestersTests.java b/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/json/SpringBootTestWithAutoConfigureJsonTestersTests.java new file mode 100644 index 0000000000..da5753b996 --- /dev/null +++ b/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/json/SpringBootTestWithAutoConfigureJsonTestersTests.java @@ -0,0 +1,54 @@ +/* + * Copyright 2012-2017 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.json; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.json.app.ExampleBasicObject; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.json.BasicJsonTester; +import org.springframework.boot.test.json.GsonTester; +import org.springframework.boot.test.json.JacksonTester; +import org.springframework.test.context.junit4.SpringRunner; + +/** + * Integration tests for {@link SpringBootTest} with {@link AutoConfigureJsonTesters}. + * + * @author Andy Wilkinson + */ +@RunWith(SpringRunner.class) +@SpringBootTest +@AutoConfigureJsonTesters +public class SpringBootTestWithAutoConfigureJsonTestersTests { + + @Autowired + BasicJsonTester basicJson; + + @Autowired + JacksonTester jacksonTester; + + @Autowired + GsonTester gsonTester; + + @Test + public void contextLoads() { + + } + +} diff --git a/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/json/ExampleBasicObject.java b/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/json/app/ExampleBasicObject.java similarity index 90% rename from spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/json/ExampleBasicObject.java rename to spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/json/app/ExampleBasicObject.java index c2f337ca29..74b27023d9 100644 --- a/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/json/ExampleBasicObject.java +++ b/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/json/app/ExampleBasicObject.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2016 the original author or authors. + * Copyright 2012-2017 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. @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.boot.test.autoconfigure.json; +package org.springframework.boot.test.autoconfigure.json.app; /** * Example object to read/write as JSON. diff --git a/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/json/ExampleCustomObject.java b/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/json/app/ExampleCustomObject.java similarity index 90% rename from spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/json/ExampleCustomObject.java rename to spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/json/app/ExampleCustomObject.java index 5cef2f416b..f25b04c02f 100644 --- a/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/json/ExampleCustomObject.java +++ b/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/json/app/ExampleCustomObject.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2016 the original author or authors. + * Copyright 2012-2017 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. @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.boot.test.autoconfigure.json; +package org.springframework.boot.test.autoconfigure.json.app; /** * Example object to read/write as JSON via {@link ExampleJsonComponent}. diff --git a/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/json/ExampleJsonApplication.java b/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/json/app/ExampleJsonApplication.java similarity index 82% rename from spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/json/ExampleJsonApplication.java rename to spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/json/app/ExampleJsonApplication.java index 2161ea5811..be64a5f2ea 100644 --- a/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/json/ExampleJsonApplication.java +++ b/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/json/app/ExampleJsonApplication.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2016 the original author or authors. + * Copyright 2012-2017 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. @@ -14,9 +14,10 @@ * limitations under the License. */ -package org.springframework.boot.test.autoconfigure.json; +package org.springframework.boot.test.autoconfigure.json.app; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.test.autoconfigure.json.JsonTest; /** * Example {@link SpringBootApplication @SpringBootApplication} for use with diff --git a/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/json/ExampleJsonComponent.java b/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/json/app/ExampleJsonComponent.java similarity index 91% rename from spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/json/ExampleJsonComponent.java rename to spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/json/app/ExampleJsonComponent.java index 64a079ebc7..a3e28a1bd5 100644 --- a/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/json/ExampleJsonComponent.java +++ b/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/json/app/ExampleJsonComponent.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2016 the original author or authors. + * Copyright 2012-2017 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. @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.boot.test.autoconfigure.json; +package org.springframework.boot.test.autoconfigure.json.app; import java.io.IOException; @@ -28,6 +28,7 @@ import com.fasterxml.jackson.databind.SerializerProvider; import org.springframework.boot.jackson.JsonComponent; import org.springframework.boot.jackson.JsonObjectDeserializer; import org.springframework.boot.jackson.JsonObjectSerializer; +import org.springframework.boot.test.autoconfigure.json.JsonTest; /** * Example {@link JsonComponent} for use with {@link JsonTest @JsonTest} tests. diff --git a/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/json/ExampleJsonObjectWithView.java b/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/json/app/ExampleJsonObjectWithView.java similarity index 94% rename from spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/json/ExampleJsonObjectWithView.java rename to spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/json/app/ExampleJsonObjectWithView.java index 25ae8ea9a3..450c20ce35 100644 --- a/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/json/ExampleJsonObjectWithView.java +++ b/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/json/app/ExampleJsonObjectWithView.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.boot.test.autoconfigure.json; +package org.springframework.boot.test.autoconfigure.json.app; import com.fasterxml.jackson.annotation.JsonView; @@ -68,7 +68,7 @@ public class ExampleJsonObjectWithView { return this.value + " " + this.id; } - static class TestView { + public static class TestView { }