diff --git a/core/spring-boot-test/src/main/java/org/springframework/boot/test/web/reactive/client/WebTestClientContextCustomizer.java b/core/spring-boot-test/src/main/java/org/springframework/boot/test/web/reactive/client/WebTestClientContextCustomizer.java deleted file mode 100644 index e4376808fab..00000000000 --- a/core/spring-boot-test/src/main/java/org/springframework/boot/test/web/reactive/client/WebTestClientContextCustomizer.java +++ /dev/null @@ -1,182 +0,0 @@ -/* - * Copyright 2012-present 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 - * - * https://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.web.reactive.client; - -import java.util.ArrayList; -import java.util.List; - -import org.jspecify.annotations.Nullable; - -import org.springframework.aot.AotDetector; -import org.springframework.beans.BeansException; -import org.springframework.beans.factory.BeanFactory; -import org.springframework.beans.factory.BeanFactoryAware; -import org.springframework.beans.factory.BeanFactoryUtils; -import org.springframework.beans.factory.FactoryBean; -import org.springframework.beans.factory.ListableBeanFactory; -import org.springframework.beans.factory.config.BeanDefinition; -import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; -import org.springframework.beans.factory.support.BeanDefinitionRegistry; -import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor; -import org.springframework.beans.factory.support.RootBeanDefinition; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.http.server.BaseUrl; -import org.springframework.boot.test.http.server.BaseUrlProviders; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; -import org.springframework.context.ConfigurableApplicationContext; -import org.springframework.context.annotation.ConfigurationClassPostProcessor; -import org.springframework.core.Ordered; -import org.springframework.core.io.support.SpringFactoriesLoader; -import org.springframework.core.io.support.SpringFactoriesLoader.ArgumentResolver; -import org.springframework.test.context.ContextCustomizer; -import org.springframework.test.context.MergedContextConfiguration; -import org.springframework.test.context.TestContextAnnotationUtils; -import org.springframework.test.web.reactive.server.WebTestClient; -import org.springframework.util.Assert; - -/** - * {@link ContextCustomizer} for {@link WebTestClient}. - * - * @author Stephane Nicoll - */ -class WebTestClientContextCustomizer implements ContextCustomizer { - - @Override - public void customizeContext(ConfigurableApplicationContext context, MergedContextConfiguration mergedConfig) { - if (AotDetector.useGeneratedArtifacts()) { - return; - } - SpringBootTest springBootTest = TestContextAnnotationUtils.findMergedAnnotation(mergedConfig.getTestClass(), - SpringBootTest.class); - Assert.state(springBootTest != null, "'springBootTest' must not be null"); - if (springBootTest.webEnvironment().isEmbedded()) { - registerWebTestClient(context); - } - } - - private void registerWebTestClient(ConfigurableApplicationContext context) { - ConfigurableListableBeanFactory beanFactory = context.getBeanFactory(); - if (beanFactory instanceof BeanDefinitionRegistry registry) { - registerWebTestClient(registry); - } - } - - private void registerWebTestClient(BeanDefinitionRegistry registry) { - RootBeanDefinition definition = new RootBeanDefinition(WebTestClientRegistrar.class); - definition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); - registry.registerBeanDefinition(WebTestClientRegistrar.class.getName(), definition); - } - - @Override - public boolean equals(@Nullable Object obj) { - return (obj != null) && (obj.getClass() == getClass()); - } - - @Override - public int hashCode() { - return getClass().hashCode(); - } - - /** - * {@link BeanDefinitionRegistryPostProcessor} that runs after the - * {@link ConfigurationClassPostProcessor} and add a {@link WebTestClientFactory} bean - * definition when a {@link WebTestClient} hasn't already been registered. - */ - static class WebTestClientRegistrar implements BeanDefinitionRegistryPostProcessor, Ordered, BeanFactoryAware { - - private @Nullable BeanFactory beanFactory; - - @Override - public void setBeanFactory(BeanFactory beanFactory) throws BeansException { - this.beanFactory = beanFactory; - } - - @Override - public int getOrder() { - return Ordered.LOWEST_PRECEDENCE; - } - - @Override - public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { - if (this.beanFactory == null || AotDetector.useGeneratedArtifacts()) { - return; - } - if (BeanFactoryUtils.beanNamesForTypeIncludingAncestors((ListableBeanFactory) this.beanFactory, - WebTestClient.class, false, false).length == 0) { - registry.registerBeanDefinition(WebTestClient.class.getName(), - new RootBeanDefinition(WebTestClientFactory.class)); - } - } - - } - - /** - * {@link FactoryBean} used to create and configure a {@link WebTestClient}. - */ - public static class WebTestClientFactory implements FactoryBean, ApplicationContextAware { - - private @Nullable ApplicationContext applicationContext; - - private @Nullable WebTestClient object; - - @Override - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - this.applicationContext = applicationContext; - } - - @Override - public Class getObjectType() { - return WebTestClient.class; - } - - @Override - public WebTestClient getObject() throws Exception { - if (this.object == null) { - this.object = createWebTestClient(); - } - return this.object; - } - - private WebTestClient createWebTestClient() { - Assert.state(this.applicationContext != null, "ApplicationContext not injected"); - WebTestClient.Builder builder = WebTestClient.bindToServer(); - customizeWebTestClientBuilder(builder); - BaseUrl baseUrl = new BaseUrlProviders(this.applicationContext).getBaseUrl(); - if (baseUrl != null) { - builder.baseUrl(baseUrl.resolve()); - } - return builder.build(); - } - - private void customizeWebTestClientBuilder(WebTestClient.Builder clientBuilder) { - Assert.state(this.applicationContext != null, "ApplicationContext not injected"); - getWebTestClientBuilderCustomizers(this.applicationContext) - .forEach((customizer) -> customizer.customize(clientBuilder)); - } - - private List getWebTestClientBuilderCustomizers(ApplicationContext context) { - List customizers = new ArrayList<>(); - customizers.addAll(SpringFactoriesLoader.forDefaultResourceLocation(context.getClassLoader()) - .load(WebTestClientBuilderCustomizer.class, ArgumentResolver.of(ApplicationContext.class, context))); - customizers.addAll(context.getBeansOfType(WebTestClientBuilderCustomizer.class).values()); - return customizers; - } - - } - -} diff --git a/core/spring-boot-test/src/main/java/org/springframework/boot/test/web/reactive/client/WebTestClientContextCustomizerFactory.java b/core/spring-boot-test/src/main/java/org/springframework/boot/test/web/reactive/client/WebTestClientContextCustomizerFactory.java deleted file mode 100644 index 90cf1869805..00000000000 --- a/core/spring-boot-test/src/main/java/org/springframework/boot/test/web/reactive/client/WebTestClientContextCustomizerFactory.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright 2012-present 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 - * - * https://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.web.reactive.client; - -import java.util.List; - -import org.jspecify.annotations.Nullable; - -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.ContextConfigurationAttributes; -import org.springframework.test.context.ContextCustomizer; -import org.springframework.test.context.ContextCustomizerFactory; -import org.springframework.test.context.TestContextAnnotationUtils; -import org.springframework.util.ClassUtils; - -/** - * {@link ContextCustomizerFactory} for {@code WebTestClient}. - * - * @author Stephane Nicoll - * @author Andy Wilkinson - * @author Anugrah Singhal - */ -class WebTestClientContextCustomizerFactory implements ContextCustomizerFactory { - - private static final boolean webClientPresent; - - static { - ClassLoader loader = WebTestClientContextCustomizerFactory.class.getClassLoader(); - webClientPresent = ClassUtils.isPresent("org.springframework.web.reactive.function.client.WebClient", loader); - } - - @Override - public @Nullable ContextCustomizer createContextCustomizer(Class testClass, - List configAttributes) { - SpringBootTest springBootTest = TestContextAnnotationUtils.findMergedAnnotation(testClass, - SpringBootTest.class); - return (springBootTest != null && webClientPresent) ? new WebTestClientContextCustomizer() : null; - } - -} diff --git a/core/spring-boot-test/src/main/resources/META-INF/spring.factories b/core/spring-boot-test/src/main/resources/META-INF/spring.factories index 74b012ead52..58c6ded1dbe 100644 --- a/core/spring-boot-test/src/main/resources/META-INF/spring.factories +++ b/core/spring-boot-test/src/main/resources/META-INF/spring.factories @@ -6,9 +6,8 @@ org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizerFacto org.springframework.boot.test.context.filter.annotation.TypeExcludeFiltersContextCustomizerFactory,\ org.springframework.boot.test.http.client.DisableReactorResourceFactoryGlobalResourcesContextCustomizerFactory,\ org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory,\ -org.springframework.boot.test.web.reactive.client.WebTestClientContextCustomizerFactory,\ org.springframework.boot.test.web.servlet.client.RestTestClientContextCustomizerFactory # Application Context Initializers org.springframework.context.ApplicationContextInitializer=\ -org.springframework.boot.test.context.filter.ExcludeFilterApplicationContextInitializer \ No newline at end of file +org.springframework.boot.test.context.filter.ExcludeFilterApplicationContextInitializer diff --git a/core/spring-boot-test/src/test/java/org/springframework/boot/test/web/reactive/client/WebTestClientContextCustomizerTests.java b/core/spring-boot-test/src/test/java/org/springframework/boot/test/web/reactive/client/WebTestClientContextCustomizerTests.java deleted file mode 100644 index 71603526cce..00000000000 --- a/core/spring-boot-test/src/test/java/org/springframework/boot/test/web/reactive/client/WebTestClientContextCustomizerTests.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright 2012-present 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 - * - * https://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.web.reactive.client; - -import org.junit.jupiter.api.Test; - -import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; -import org.springframework.beans.factory.support.DefaultListableBeanFactory; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; -import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.boot.test.web.reactive.client.WebTestClientContextCustomizer.WebTestClientRegistrar; -import org.springframework.context.ConfigurableApplicationContext; -import org.springframework.context.support.AbstractApplicationContext; -import org.springframework.test.context.MergedContextConfiguration; -import org.springframework.test.web.reactive.server.WebTestClient; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.BDDMockito.given; -import static org.mockito.Mockito.mock; - -/** - * Tests for {@link WebTestClientContextCustomizer}. - * - * @author Moritz Halbritter - */ -class WebTestClientContextCustomizerTests { - - @Test - void whenContextIsNotABeanDefinitionRegistryWebTestClientIsRegistered() { - new ApplicationContextRunner(TestApplicationContext::new) - .withInitializer(this::applyWebTestClientContextCustomizer) - .run((context) -> assertThat(context).hasSingleBean(WebTestClient.class)); - } - - @Test - void whenUsingAotGeneratedArtifactsWebTestClientIsNotRegistered() { - new ApplicationContextRunner().withSystemProperties("spring.aot.enabled:true") - .withInitializer(this::applyWebTestClientContextCustomizer) - .run((context) -> { - assertThat(context).doesNotHaveBean(WebTestClientRegistrar.class); - assertThat(context).doesNotHaveBean(WebTestClient.class); - }); - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - void applyWebTestClientContextCustomizer(ConfigurableApplicationContext context) { - MergedContextConfiguration configuration = mock(MergedContextConfiguration.class); - given(configuration.getTestClass()).willReturn((Class) TestClass.class); - new WebTestClientContextCustomizer().customizeContext(context, configuration); - } - - @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) - static class TestClass { - - } - - static class TestApplicationContext extends AbstractApplicationContext { - - private final ConfigurableListableBeanFactory beanFactory = new DefaultListableBeanFactory(); - - @Override - protected void refreshBeanFactory() { - } - - @Override - protected void closeBeanFactory() { - - } - - @Override - public ConfigurableListableBeanFactory getBeanFactory() { - return this.beanFactory; - } - - } - -} diff --git a/integration-test/spring-boot-test-integration-tests/build.gradle b/integration-test/spring-boot-test-integration-tests/build.gradle index 263b9a6f976..81a8370369e 100644 --- a/integration-test/spring-boot-test-integration-tests/build.gradle +++ b/integration-test/spring-boot-test-integration-tests/build.gradle @@ -28,6 +28,7 @@ dependencies { testImplementation(project(":module:spring-boot-http-codec")) testImplementation(project(":module:spring-boot-restclient-test")) testImplementation(project(":module:spring-boot-tomcat")) + testImplementation(project(":module:spring-boot-webflux-test")) testImplementation(project(":module:spring-boot-web-server")) testImplementation("io.projectreactor.netty:reactor-netty-http") testImplementation("org.springframework:spring-webmvc") diff --git a/integration-test/spring-boot-test-integration-tests/src/test/java/org/springframework/boot/test/web/reactive/client/NoWebTestClientBeanChecker.java b/integration-test/spring-boot-test-integration-tests/src/test/java/org/springframework/boot/test/web/reactive/client/NoWebTestClientBeanChecker.java deleted file mode 100644 index 039485bf5e1..00000000000 --- a/integration-test/spring-boot-test-integration-tests/src/test/java/org/springframework/boot/test/web/reactive/client/NoWebTestClientBeanChecker.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2012-present 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 - * - * https://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.web.reactive.client; - -import org.springframework.beans.factory.BeanFactory; -import org.springframework.beans.factory.BeanFactoryAware; -import org.springframework.beans.factory.BeanFactoryUtils; -import org.springframework.beans.factory.ListableBeanFactory; -import org.springframework.context.annotation.ImportSelector; -import org.springframework.core.type.AnnotationMetadata; -import org.springframework.test.web.reactive.server.WebTestClient; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * {@link ImportSelector} to check no {@link WebTestClient} definition is registered when - * config classes are processed. - */ -class NoWebTestClientBeanChecker implements ImportSelector, BeanFactoryAware { - - @Override - public void setBeanFactory(BeanFactory beanFactory) { - assertThat(BeanFactoryUtils.beanNamesForTypeIncludingAncestors((ListableBeanFactory) beanFactory, - WebTestClient.class)) - .isEmpty(); - } - - @Override - public String[] selectImports(AnnotationMetadata importingClassMetadata) { - return new String[0]; - } - -} diff --git a/integration-test/spring-boot-test-integration-tests/src/test/java/org/springframework/boot/test/web/reactive/client/WebTestClientContextCustomizerIntegrationTests.java b/integration-test/spring-boot-test-integration-tests/src/test/java/org/springframework/boot/test/web/reactive/client/WebTestClientContextCustomizerIntegrationTests.java deleted file mode 100644 index 08ad57f5ce6..00000000000 --- a/integration-test/spring-boot-test-integration-tests/src/test/java/org/springframework/boot/test/web/reactive/client/WebTestClientContextCustomizerIntegrationTests.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright 2012-present 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 - * - * https://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.web.reactive.client; - -import org.junit.jupiter.api.Test; -import reactor.core.publisher.Mono; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; -import org.springframework.boot.tomcat.reactive.TomcatReactiveWebServerFactory; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; -import org.springframework.core.io.buffer.DefaultDataBufferFactory; -import org.springframework.http.HttpStatus; -import org.springframework.http.server.reactive.HttpHandler; -import org.springframework.http.server.reactive.ServerHttpRequest; -import org.springframework.http.server.reactive.ServerHttpResponse; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.web.reactive.server.WebTestClient; -import org.springframework.test.web.reactive.server.WebTestClient.Builder; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.BDDMockito.then; -import static org.mockito.Mockito.mock; - -/** - * Integration test for {@link WebTestClientContextCustomizer}. - * - * @author Phillip Webb - */ -@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT, properties = "spring.main.web-application-type=reactive") -@DirtiesContext -class WebTestClientContextCustomizerIntegrationTests { - - @Autowired - private WebTestClient webTestClient; - - @Autowired - private WebTestClientBuilderCustomizer clientBuilderCustomizer; - - @Test - void test() { - then(this.clientBuilderCustomizer).should().customize(any(Builder.class)); - this.webTestClient.get().uri("/").exchange().expectBody(String.class).isEqualTo("hello"); - } - - @Configuration(proxyBeanMethods = false) - @Import({ TestHandler.class, NoWebTestClientBeanChecker.class }) - static class TestConfig { - - @Bean - TomcatReactiveWebServerFactory webServerFactory() { - return new TomcatReactiveWebServerFactory(0); - } - - @Bean - WebTestClientBuilderCustomizer clientBuilderCustomizer() { - return mock(WebTestClientBuilderCustomizer.class); - } - - } - - static class TestHandler implements HttpHandler { - - private static final DefaultDataBufferFactory factory = new DefaultDataBufferFactory(); - - @Override - public Mono handle(ServerHttpRequest request, ServerHttpResponse response) { - response.setStatusCode(HttpStatus.OK); - return response.writeWith(Mono.just(factory.wrap("hello".getBytes()))); - } - - } - -} diff --git a/integration-test/spring-boot-test-integration-tests/src/test/java/org/springframework/boot/test/web/reactive/client/WebTestClientContextCustomizerTcfCacheContextPausingTests.java b/integration-test/spring-boot-test-integration-tests/src/test/java/org/springframework/boot/test/web/reactive/client/WebTestClientContextCustomizerTcfCacheContextPausingTests.java deleted file mode 100644 index 99267d0cf9e..00000000000 --- a/integration-test/spring-boot-test-integration-tests/src/test/java/org/springframework/boot/test/web/reactive/client/WebTestClientContextCustomizerTcfCacheContextPausingTests.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright 2012-present 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 - * - * https://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.web.reactive.client; - -import java.util.Collections; -import java.util.Map; - -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import reactor.core.publisher.Mono; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.SpringBootConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.tomcat.reactive.TomcatReactiveWebServerFactory; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Import; -import org.springframework.core.io.buffer.DefaultDataBufferFactory; -import org.springframework.http.HttpStatus; -import org.springframework.http.server.reactive.ContextPathCompositeHandler; -import org.springframework.http.server.reactive.HttpHandler; -import org.springframework.http.server.reactive.ServerHttpRequest; -import org.springframework.http.server.reactive.ServerHttpResponse; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.web.reactive.server.WebTestClient; - -/** - * Tests for {@link WebTestClientContextCustomizer} when the test context framework pauses - * a context while it's in the cache. - * - * @author Andy Wilkinson - */ -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, - properties = "spring.main.web-application-type=none") -class WebTestClientContextCustomizerTcfCacheContextPausingTests { - - @Nested - @Import(TestConfig.class) - @TestPropertySource(properties = { "context=one", "spring.main.web-application-type=reactive" }) - class ContextOne { - - @Autowired - private WebTestClient webTestClient; - - @Test - void test() { - this.webTestClient.get().uri("/test").exchange().expectBody(String.class).isEqualTo("hello world"); - } - - } - - @Nested - @Import(TestConfig.class) - @TestPropertySource(properties = { "context=two", "spring.main.web-application-type=reactive" }) - class ContextTwo { - - @Autowired - private WebTestClient webTestClient; - - @Test - void test() { - this.webTestClient.get().uri("/test").exchange().expectBody(String.class).isEqualTo("hello world"); - } - - } - - @Nested - @Import(TestConfig.class) - @TestPropertySource(properties = { "context=one", "spring.main.web-application-type=reactive" }) - class ReuseContextOne { - - @Autowired - private WebTestClient webTestClient; - - @Test - void test() { - this.webTestClient.get().uri("/test").exchange().expectBody(String.class).isEqualTo("hello world"); - } - - } - - @SpringBootConfiguration(proxyBeanMethods = false) - static class TestConfig { - - @Bean - TomcatReactiveWebServerFactory webServerFactory() { - return new TomcatReactiveWebServerFactory(0); - } - - @Bean - HttpHandler httpHandler() { - TestHandler httpHandler = new TestHandler(); - Map handlersMap = Collections.singletonMap("/test", httpHandler); - return new ContextPathCompositeHandler(handlersMap); - } - - } - - static class TestHandler implements HttpHandler { - - private static final DefaultDataBufferFactory factory = new DefaultDataBufferFactory(); - - @Override - public Mono handle(ServerHttpRequest request, ServerHttpResponse response) { - response.setStatusCode(HttpStatus.OK); - return response.writeWith(Mono.just(factory.wrap("hello world".getBytes()))); - } - - } - -} diff --git a/integration-test/spring-boot-test-integration-tests/src/test/java/org/springframework/boot/test/web/reactive/client/WebTestClientContextCustomizerWithCustomBasePathTests.java b/integration-test/spring-boot-test-integration-tests/src/test/java/org/springframework/boot/test/web/reactive/client/WebTestClientContextCustomizerWithCustomBasePathTests.java deleted file mode 100644 index 48e253e5b9a..00000000000 --- a/integration-test/spring-boot-test-integration-tests/src/test/java/org/springframework/boot/test/web/reactive/client/WebTestClientContextCustomizerWithCustomBasePathTests.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright 2012-present 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 - * - * https://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.web.reactive.client; - -import java.util.Collections; -import java.util.Map; - -import org.junit.jupiter.api.Test; -import reactor.core.publisher.Mono; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.tomcat.reactive.TomcatReactiveWebServerFactory; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.io.buffer.DefaultDataBufferFactory; -import org.springframework.http.HttpStatus; -import org.springframework.http.server.reactive.ContextPathCompositeHandler; -import org.springframework.http.server.reactive.HttpHandler; -import org.springframework.http.server.reactive.ServerHttpRequest; -import org.springframework.http.server.reactive.ServerHttpResponse; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.web.reactive.server.WebTestClient; - -/** - * Tests for {@link WebTestClientContextCustomizer} with a custom base path for a reactive - * web application. - * - * @author Madhura Bhave - */ -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, - properties = "spring.main.web-application-type=reactive") -@TestPropertySource(properties = "spring.webflux.base-path=/test") -class WebTestClientContextCustomizerWithCustomBasePathTests { - - @Autowired - private WebTestClient webTestClient; - - @Test - void test() { - this.webTestClient.get().uri("/hello").exchange().expectBody(String.class).isEqualTo("hello world"); - } - - @Configuration(proxyBeanMethods = false) - static class TestConfig { - - @Bean - TomcatReactiveWebServerFactory webServerFactory() { - return new TomcatReactiveWebServerFactory(0); - } - - @Bean - HttpHandler httpHandler() { - TestHandler httpHandler = new TestHandler(); - Map handlersMap = Collections.singletonMap("/test", httpHandler); - return new ContextPathCompositeHandler(handlersMap); - } - - } - - static class TestHandler implements HttpHandler { - - private static final DefaultDataBufferFactory factory = new DefaultDataBufferFactory(); - - @Override - public Mono handle(ServerHttpRequest request, ServerHttpResponse response) { - response.setStatusCode(HttpStatus.OK); - return response.writeWith(Mono.just(factory.wrap("hello world".getBytes()))); - } - - } - -} diff --git a/integration-test/spring-boot-test-integration-tests/src/test/java/org/springframework/boot/test/web/reactive/client/WebTestClientContextCustomizerWithCustomContextPathTests.java b/integration-test/spring-boot-test-integration-tests/src/test/java/org/springframework/boot/test/web/reactive/client/WebTestClientContextCustomizerWithCustomContextPathTests.java deleted file mode 100644 index 33b1750ab04..00000000000 --- a/integration-test/spring-boot-test-integration-tests/src/test/java/org/springframework/boot/test/web/reactive/client/WebTestClientContextCustomizerWithCustomContextPathTests.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright 2012-present 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 - * - * https://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.web.reactive.client; - -import org.junit.jupiter.api.Test; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.tomcat.servlet.TomcatServletWebServerFactory; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.web.reactive.server.WebTestClient; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.servlet.DispatcherServlet; - -/** - * Tests for {@link WebTestClientContextCustomizer} with a custom context path for a - * servlet web application. - * - * @author Madhura Bhave - */ -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -@TestPropertySource(properties = "server.servlet.context-path=/test") -class WebTestClientContextCustomizerWithCustomContextPathTests { - - @Autowired - private WebTestClient webTestClient; - - @Test - void test() { - this.webTestClient.get().uri("/hello").exchange().expectBody(String.class).isEqualTo("hello world"); - } - - @Configuration(proxyBeanMethods = false) - @Import(TestController.class) - static class TestConfig { - - @Bean - TomcatServletWebServerFactory webServerFactory() { - TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory(0); - factory.setContextPath("/test"); - return factory; - } - - @Bean - DispatcherServlet dispatcherServlet() { - return new DispatcherServlet(); - } - - } - - @RestController - static class TestController { - - @GetMapping("/hello") - String hello() { - return "hello world"; - } - - } - -} diff --git a/integration-test/spring-boot-test-integration-tests/src/test/java/org/springframework/boot/test/web/reactive/client/WebTestClientContextCustomizerWithOverrideIntegrationTests.java b/integration-test/spring-boot-test-integration-tests/src/test/java/org/springframework/boot/test/web/reactive/client/WebTestClientContextCustomizerWithOverrideIntegrationTests.java deleted file mode 100644 index 175ea9ed8e1..00000000000 --- a/integration-test/spring-boot-test-integration-tests/src/test/java/org/springframework/boot/test/web/reactive/client/WebTestClientContextCustomizerWithOverrideIntegrationTests.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright 2012-present 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 - * - * https://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.web.reactive.client; - -import org.junit.jupiter.api.Test; -import reactor.core.publisher.Mono; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; -import org.springframework.boot.tomcat.reactive.TomcatReactiveWebServerFactory; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; -import org.springframework.core.io.buffer.DefaultDataBufferFactory; -import org.springframework.http.HttpStatus; -import org.springframework.http.server.reactive.HttpHandler; -import org.springframework.http.server.reactive.ServerHttpRequest; -import org.springframework.http.server.reactive.ServerHttpResponse; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.web.reactive.server.WebTestClient; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.mock; - -/** - * Integration test for {@link WebTestClientContextCustomizer} with a custom - * {@link WebTestClient} bean. - * - * @author Phillip Webb - */ -@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT, properties = "spring.main.web-application-type=reactive") -@DirtiesContext -class WebTestClientContextCustomizerWithOverrideIntegrationTests { - - @Autowired - private WebTestClient webTestClient; - - @Test - void test() { - assertThat(this.webTestClient).isInstanceOf(CustomWebTestClient.class); - } - - @Configuration(proxyBeanMethods = false) - @Import({ TestHandler.class, NoWebTestClientBeanChecker.class }) - static class TestConfig { - - @Bean - TomcatReactiveWebServerFactory webServerFactory() { - return new TomcatReactiveWebServerFactory(0); - } - - @Bean - WebTestClient webTestClient() { - return mock(CustomWebTestClient.class); - } - - } - - static class TestHandler implements HttpHandler { - - private static final DefaultDataBufferFactory factory = new DefaultDataBufferFactory(); - - @Override - public Mono handle(ServerHttpRequest request, ServerHttpResponse response) { - response.setStatusCode(HttpStatus.OK); - return response.writeWith(Mono.just(factory.wrap("hello".getBytes()))); - } - - } - - interface CustomWebTestClient extends WebTestClient { - - } - -} diff --git a/integration-test/spring-boot-test-integration-tests/src/test/java/org/springframework/boot/test/web/reactive/client/WebTestClientContextCustomizerWithoutWebfluxIntegrationTests.java b/integration-test/spring-boot-test-integration-tests/src/test/java/org/springframework/boot/test/web/reactive/client/WebTestClientContextCustomizerWithoutWebfluxIntegrationTests.java deleted file mode 100644 index e2af56eead6..00000000000 --- a/integration-test/spring-boot-test-integration-tests/src/test/java/org/springframework/boot/test/web/reactive/client/WebTestClientContextCustomizerWithoutWebfluxIntegrationTests.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 2012-present 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 - * - * https://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.web.reactive.client; - -import java.util.Collections; - -import org.junit.jupiter.api.Test; - -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.testsupport.classpath.ClassPathExclusions; -import org.springframework.test.context.ContextCustomizer; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Tests for {@link WebTestClientContextCustomizerFactory} when spring webflux is not on - * the classpath. - * - * @author Tobias Gesellchen - * @author Stephane Nicoll - */ -@ClassPathExclusions("spring-webflux*.jar") -class WebTestClientContextCustomizerWithoutWebfluxIntegrationTests { - - @Test - void customizerIsNotCreatedWithoutWebClient() { - WebTestClientContextCustomizerFactory contextCustomizerFactory = new WebTestClientContextCustomizerFactory(); - ContextCustomizer contextCustomizer = contextCustomizerFactory.createContextCustomizer(TestClass.class, - Collections.emptyList()); - assertThat(contextCustomizer).isNull(); - } - - @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) - private static final class TestClass { - - } - -} diff --git a/integration-test/spring-boot-test-integration-tests/src/test/java/org/springframework/boot/web/server/test/AbstractSpringBootTestEmbeddedReactiveWebEnvironmentTests.java b/integration-test/spring-boot-test-integration-tests/src/test/java/org/springframework/boot/web/server/test/AbstractSpringBootTestEmbeddedReactiveWebEnvironmentTests.java index c2f62e534cf..8456d1f8193 100644 --- a/integration-test/spring-boot-test-integration-tests/src/test/java/org/springframework/boot/web/server/test/AbstractSpringBootTestEmbeddedReactiveWebEnvironmentTests.java +++ b/integration-test/spring-boot-test-integration-tests/src/test/java/org/springframework/boot/web/server/test/AbstractSpringBootTestEmbeddedReactiveWebEnvironmentTests.java @@ -30,6 +30,7 @@ import org.springframework.boot.test.web.server.LocalServerPort; import org.springframework.boot.tomcat.reactive.TomcatReactiveWebServerFactory; import org.springframework.boot.web.context.reactive.ReactiveWebApplicationContext; import org.springframework.boot.web.server.reactive.ReactiveWebServerFactory; +import org.springframework.boot.webflux.test.autoconfigure.AutoConfigureWebTestClient; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -47,6 +48,7 @@ import static org.assertj.core.api.Assertions.assertThat; * * @author Stephane Nicoll */ +@AutoConfigureWebTestClient @AutoConfigureTestRestTemplate abstract class AbstractSpringBootTestEmbeddedReactiveWebEnvironmentTests { diff --git a/module/spring-boot-graphql-test/src/main/java/org/springframework/boot/graphql/test/autoconfigure/tester/AutoConfigureHttpGraphQlTester.java b/module/spring-boot-graphql-test/src/main/java/org/springframework/boot/graphql/test/autoconfigure/tester/AutoConfigureHttpGraphQlTester.java index cbb81a83276..00eb69b6fbc 100644 --- a/module/spring-boot-graphql-test/src/main/java/org/springframework/boot/graphql/test/autoconfigure/tester/AutoConfigureHttpGraphQlTester.java +++ b/module/spring-boot-graphql-test/src/main/java/org/springframework/boot/graphql/test/autoconfigure/tester/AutoConfigureHttpGraphQlTester.java @@ -31,11 +31,6 @@ import org.springframework.graphql.test.tester.HttpGraphQlTester; /** * Annotation that can be applied to a test class to enable an {@link HttpGraphQlTester}. * - *

- * This annotation should be used with - * {@link org.springframework.boot.test.context.SpringBootTest @SpringBootTest} tests with - * Spring MVC or Spring WebFlux mock infrastructures. - * * @author Brian Clozel * @since 4.0.0 * @see HttpGraphQlTesterAutoConfiguration diff --git a/module/spring-boot-graphql-test/src/main/java/org/springframework/boot/graphql/test/tester/HttpGraphQlTesterContextCustomizer.java b/module/spring-boot-graphql-test/src/main/java/org/springframework/boot/graphql/test/tester/HttpGraphQlTesterContextCustomizer.java deleted file mode 100644 index cdb09a97376..00000000000 --- a/module/spring-boot-graphql-test/src/main/java/org/springframework/boot/graphql/test/tester/HttpGraphQlTesterContextCustomizer.java +++ /dev/null @@ -1,232 +0,0 @@ -/* - * Copyright 2012-present 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 - * - * https://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.graphql.test.tester; - -import jakarta.servlet.ServletContext; -import org.jspecify.annotations.Nullable; - -import org.springframework.aot.AotDetector; -import org.springframework.beans.BeansException; -import org.springframework.beans.factory.BeanFactory; -import org.springframework.beans.factory.BeanFactoryAware; -import org.springframework.beans.factory.BeanFactoryUtils; -import org.springframework.beans.factory.FactoryBean; -import org.springframework.beans.factory.ListableBeanFactory; -import org.springframework.beans.factory.NoSuchBeanDefinitionException; -import org.springframework.beans.factory.config.BeanDefinition; -import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; -import org.springframework.beans.factory.support.BeanDefinitionRegistry; -import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor; -import org.springframework.beans.factory.support.RootBeanDefinition; -import org.springframework.boot.WebApplicationType; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.web.server.AbstractConfigurableWebServerFactory; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; -import org.springframework.context.ConfigurableApplicationContext; -import org.springframework.core.Ordered; -import org.springframework.graphql.test.tester.HttpGraphQlTester; -import org.springframework.test.context.ContextCustomizer; -import org.springframework.test.context.MergedContextConfiguration; -import org.springframework.test.context.TestContextAnnotationUtils; -import org.springframework.test.web.reactive.server.WebTestClient; -import org.springframework.util.Assert; -import org.springframework.util.ClassUtils; -import org.springframework.util.StringUtils; -import org.springframework.web.context.WebApplicationContext; - -/** - * {@link ContextCustomizer} for {@link HttpGraphQlTester}. - * - * @author Brian Clozel - */ -class HttpGraphQlTesterContextCustomizer implements ContextCustomizer { - - @Override - public void customizeContext(ConfigurableApplicationContext context, MergedContextConfiguration mergedConfig) { - if (AotDetector.useGeneratedArtifacts()) { - return; - } - SpringBootTest springBootTest = TestContextAnnotationUtils.findMergedAnnotation(mergedConfig.getTestClass(), - SpringBootTest.class); - Assert.state(springBootTest != null, "'springBootTest' must not be null"); - if (springBootTest.webEnvironment().isEmbedded()) { - registerHttpGraphQlTester(context); - } - } - - private void registerHttpGraphQlTester(ConfigurableApplicationContext context) { - ConfigurableListableBeanFactory beanFactory = context.getBeanFactory(); - if (beanFactory instanceof BeanDefinitionRegistry beanDefinitionRegistry) { - registerHttpGraphQlTester(beanDefinitionRegistry); - } - } - - private void registerHttpGraphQlTester(BeanDefinitionRegistry registry) { - RootBeanDefinition definition = new RootBeanDefinition(HttpGraphQlTesterRegistrar.class); - definition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); - registry.registerBeanDefinition(HttpGraphQlTesterRegistrar.class.getName(), definition); - } - - @Override - public boolean equals(@Nullable Object obj) { - return (obj != null) && (obj.getClass() == getClass()); - } - - @Override - public int hashCode() { - return getClass().hashCode(); - } - - static class HttpGraphQlTesterRegistrar implements BeanDefinitionRegistryPostProcessor, Ordered, BeanFactoryAware { - - @SuppressWarnings("NullAway.Init") - private BeanFactory beanFactory; - - @Override - public void setBeanFactory(BeanFactory beanFactory) throws BeansException { - this.beanFactory = beanFactory; - } - - @Override - public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { - if (AotDetector.useGeneratedArtifacts()) { - return; - } - if (BeanFactoryUtils.beanNamesForTypeIncludingAncestors((ListableBeanFactory) this.beanFactory, - HttpGraphQlTester.class, false, false).length == 0) { - registry.registerBeanDefinition(HttpGraphQlTester.class.getName(), - new RootBeanDefinition(HttpGraphQlTesterFactory.class)); - } - } - - @Override - public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { - - } - - @Override - public int getOrder() { - return Ordered.LOWEST_PRECEDENCE - 1; - } - - } - - public static class HttpGraphQlTesterFactory implements FactoryBean, ApplicationContextAware { - - private static final String SERVLET_APPLICATION_CONTEXT_CLASS = "org.springframework.web.context.WebApplicationContext"; - - private static final String REACTIVE_APPLICATION_CONTEXT_CLASS = "org.springframework.boot.web.context.reactive.ReactiveWebApplicationContext"; - - @SuppressWarnings("NullAway.Init") - private ApplicationContext applicationContext; - - private @Nullable HttpGraphQlTester object; - - @Override - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - this.applicationContext = applicationContext; - } - - @Override - public boolean isSingleton() { - return true; - } - - @Override - public Class getObjectType() { - return HttpGraphQlTester.class; - } - - @Override - public HttpGraphQlTester getObject() throws Exception { - if (this.object == null) { - this.object = createGraphQlTester(); - } - return this.object; - } - - private HttpGraphQlTester createGraphQlTester() { - WebTestClient webTestClient = this.applicationContext.getBean(WebTestClient.class); - boolean sslEnabled = isSslEnabled(this.applicationContext); - String port = this.applicationContext.getEnvironment().getProperty("local.server.port", "8080"); - WebTestClient mutatedWebClient = webTestClient.mutate().baseUrl(getBaseUrl(sslEnabled, port)).build(); - return HttpGraphQlTester.create(mutatedWebClient); - } - - private String getBaseUrl(boolean sslEnabled, String port) { - String basePath = deduceBasePath(); - return (sslEnabled ? "https" : "http") + "://localhost:" + port + basePath; - } - - private String deduceBasePath() { - return deduceServerBasePath() + findConfiguredGraphQlPath(); - } - - private String findConfiguredGraphQlPath() { - String configuredPath = this.applicationContext.getEnvironment().getProperty("spring.graphql.http.path"); - return StringUtils.hasText(configuredPath) ? configuredPath : "/graphql"; - } - - private String deduceServerBasePath() { - String serverBasePath = ""; - WebApplicationType webApplicationType = deduceFromApplicationContext(this.applicationContext.getClass()); - if (webApplicationType == WebApplicationType.REACTIVE) { - serverBasePath = this.applicationContext.getEnvironment().getProperty("spring.webflux.base-path"); - - } - else if (webApplicationType == WebApplicationType.SERVLET) { - ServletContext servletContext = ((WebApplicationContext) this.applicationContext).getServletContext(); - Assert.state(servletContext != null, "'servletContext' must not be null"); - serverBasePath = servletContext.getContextPath(); - } - return (serverBasePath != null) ? serverBasePath : ""; - } - - static WebApplicationType deduceFromApplicationContext(Class applicationContextClass) { - if (isAssignable(SERVLET_APPLICATION_CONTEXT_CLASS, applicationContextClass)) { - return WebApplicationType.SERVLET; - } - if (isAssignable(REACTIVE_APPLICATION_CONTEXT_CLASS, applicationContextClass)) { - return WebApplicationType.REACTIVE; - } - return WebApplicationType.NONE; - } - - private static boolean isAssignable(String target, Class type) { - try { - return ClassUtils.resolveClassName(target, null).isAssignableFrom(type); - } - catch (Throwable ex) { - return false; - } - } - - private boolean isSslEnabled(ApplicationContext context) { - try { - AbstractConfigurableWebServerFactory webServerFactory = context - .getBean(AbstractConfigurableWebServerFactory.class); - return webServerFactory.getSsl() != null && webServerFactory.getSsl().isEnabled(); - } - catch (NoSuchBeanDefinitionException ex) { - return false; - } - } - - } - -} diff --git a/module/spring-boot-graphql-test/src/main/java/org/springframework/boot/graphql/test/tester/HttpGraphQlTesterContextCustomizerFactory.java b/module/spring-boot-graphql-test/src/main/java/org/springframework/boot/graphql/test/tester/HttpGraphQlTesterContextCustomizerFactory.java deleted file mode 100644 index f906e0781d8..00000000000 --- a/module/spring-boot-graphql-test/src/main/java/org/springframework/boot/graphql/test/tester/HttpGraphQlTesterContextCustomizerFactory.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2012-present 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 - * - * https://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.graphql.test.tester; - -import java.util.List; - -import org.jspecify.annotations.Nullable; - -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.graphql.test.tester.HttpGraphQlTester; -import org.springframework.test.context.ContextConfigurationAttributes; -import org.springframework.test.context.ContextCustomizer; -import org.springframework.test.context.ContextCustomizerFactory; -import org.springframework.test.context.TestContextAnnotationUtils; -import org.springframework.util.ClassUtils; - -/** - * {@link ContextCustomizerFactory} for {@link HttpGraphQlTester}. - * - * @author Brian Clozel - * @see HttpGraphQlTesterContextCustomizer - */ -class HttpGraphQlTesterContextCustomizerFactory implements ContextCustomizerFactory { - - private static final String HTTPGRAPHQLTESTER_CLASS = "org.springframework.graphql.test.tester.HttpGraphQlTester"; - - private static final String WEBTESTCLIENT_CLASS = "org.springframework.test.web.reactive.server.WebTestClient"; - - @Override - public @Nullable ContextCustomizer createContextCustomizer(Class testClass, - List configAttributes) { - SpringBootTest springBootTest = TestContextAnnotationUtils.findMergedAnnotation(testClass, - SpringBootTest.class); - return (springBootTest != null && isGraphQlTesterPresent()) ? new HttpGraphQlTesterContextCustomizer() : null; - } - - private boolean isGraphQlTesterPresent() { - return ClassUtils.isPresent(WEBTESTCLIENT_CLASS, getClass().getClassLoader()) - && ClassUtils.isPresent(HTTPGRAPHQLTESTER_CLASS, getClass().getClassLoader()); - } - -} diff --git a/module/spring-boot-graphql-test/src/main/java/org/springframework/boot/graphql/test/tester/package-info.java b/module/spring-boot-graphql-test/src/main/java/org/springframework/boot/graphql/test/tester/package-info.java deleted file mode 100644 index d3c812f1b61..00000000000 --- a/module/spring-boot-graphql-test/src/main/java/org/springframework/boot/graphql/test/tester/package-info.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2012-present 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 - * - * https://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. - */ - -/** - * {@link org.springframework.graphql.test.tester.GraphQlTester} utilities. - */ -@NullMarked -package org.springframework.boot.graphql.test.tester; - -import org.jspecify.annotations.NullMarked; diff --git a/module/spring-boot-graphql-test/src/main/resources/META-INF/spring.factories b/module/spring-boot-graphql-test/src/main/resources/META-INF/spring.factories deleted file mode 100644 index 6f1b03ab271..00000000000 --- a/module/spring-boot-graphql-test/src/main/resources/META-INF/spring.factories +++ /dev/null @@ -1,3 +0,0 @@ -# Spring Test Context Customizer Factories -org.springframework.test.context.ContextCustomizerFactory=\ -org.springframework.boot.graphql.test.tester.HttpGraphQlTesterContextCustomizerFactory diff --git a/module/spring-boot-graphql-test/src/test/java/org/springframework/boot/graphql/test/tester/HttpGraphQlTesterContextCustomizerIntegrationTests.java b/module/spring-boot-graphql-test/src/test/java/org/springframework/boot/graphql/test/tester/HttpGraphQlTesterContextCustomizerIntegrationTests.java deleted file mode 100644 index 8a60e7f1daf..00000000000 --- a/module/spring-boot-graphql-test/src/test/java/org/springframework/boot/graphql/test/tester/HttpGraphQlTesterContextCustomizerIntegrationTests.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright 2012-present 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 - * - * https://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.graphql.test.tester; - -import java.util.Collections; -import java.util.Map; - -import org.junit.jupiter.api.Test; -import reactor.core.publisher.Mono; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.tomcat.reactive.TomcatReactiveWebServerFactory; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.io.buffer.DefaultDataBufferFactory; -import org.springframework.graphql.test.tester.HttpGraphQlTester; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.server.reactive.ContextPathCompositeHandler; -import org.springframework.http.server.reactive.HttpHandler; -import org.springframework.http.server.reactive.ServerHttpRequest; -import org.springframework.http.server.reactive.ServerHttpResponse; -import org.springframework.test.annotation.DirtiesContext; - -/** - * Integration test for {@link HttpGraphQlTesterContextCustomizer}. - * - * @author Brian Clozel - */ -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, - properties = "spring.main.web-application-type=reactive") -@DirtiesContext -class HttpGraphQlTesterContextCustomizerIntegrationTests { - - @Autowired - HttpGraphQlTester graphQlTester; - - @Test - void shouldHandleGraphQlRequests() { - this.graphQlTester.document("{}").executeAndVerify(); - } - - @Configuration(proxyBeanMethods = false) - static class TestConfig { - - @Bean - TomcatReactiveWebServerFactory webServerFactory() { - return new TomcatReactiveWebServerFactory(0); - } - - @Bean - HttpHandler httpHandler() { - TestHandler httpHandler = new TestHandler(); - Map handlersMap = Collections.singletonMap("/graphql", httpHandler); - return new ContextPathCompositeHandler(handlersMap); - } - - } - - static class TestHandler implements HttpHandler { - - private static final DefaultDataBufferFactory factory = new DefaultDataBufferFactory(); - - @Override - public Mono handle(ServerHttpRequest request, ServerHttpResponse response) { - response.setStatusCode(HttpStatus.OK); - response.getHeaders().setContentType(MediaType.APPLICATION_JSON); - return response.writeWith(Mono.just(factory.wrap("{\"data\":{}}".getBytes()))); - } - - } - -} diff --git a/module/spring-boot-graphql-test/src/test/java/org/springframework/boot/graphql/test/tester/HttpGraphQlTesterContextCustomizerTests.java b/module/spring-boot-graphql-test/src/test/java/org/springframework/boot/graphql/test/tester/HttpGraphQlTesterContextCustomizerTests.java deleted file mode 100644 index 3baf21a55e9..00000000000 --- a/module/spring-boot-graphql-test/src/test/java/org/springframework/boot/graphql/test/tester/HttpGraphQlTesterContextCustomizerTests.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright 2012-present 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 - * - * https://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.graphql.test.tester; - -import org.junit.jupiter.api.Test; - -import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; -import org.springframework.beans.factory.support.DefaultListableBeanFactory; -import org.springframework.boot.graphql.test.tester.HttpGraphQlTesterContextCustomizer.HttpGraphQlTesterRegistrar; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; -import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.context.ConfigurableApplicationContext; -import org.springframework.context.support.AbstractApplicationContext; -import org.springframework.graphql.test.tester.HttpGraphQlTester; -import org.springframework.test.context.MergedContextConfiguration; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.BDDMockito.given; -import static org.mockito.Mockito.mock; - -/** - * Tests for HttpGraphQlTesterContextCustomizer. - * - * @author Moritz Halbritter - */ -class HttpGraphQlTesterContextCustomizerTests { - - @Test - void whenContextIsNotABeanDefinitionRegistryHttpGraphQlTesterIsRegistered() { - new ApplicationContextRunner(HttpGraphQlTesterContextCustomizerTests.TestApplicationContext::new) - .withInitializer(this::applyHttpGraphQlTesterContextCustomizer) - .run((context) -> assertThat(context).hasSingleBean(HttpGraphQlTester.class)); - } - - @Test - void whenUsingAotGeneratedArtifactsHttpGraphQlTesterIsNotRegistered() { - new ApplicationContextRunner().withSystemProperties("spring.aot.enabled:true") - .withInitializer(this::applyHttpGraphQlTesterContextCustomizer) - .run((context) -> { - assertThat(context).doesNotHaveBean(HttpGraphQlTesterRegistrar.class); - assertThat(context).doesNotHaveBean(HttpGraphQlTester.class); - }); - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - void applyHttpGraphQlTesterContextCustomizer(ConfigurableApplicationContext context) { - MergedContextConfiguration configuration = mock(MergedContextConfiguration.class); - given(configuration.getTestClass()).willReturn((Class) HttpGraphQlTesterContextCustomizerTests.TestClass.class); - new HttpGraphQlTesterContextCustomizer().customizeContext(context, configuration); - } - - @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) - static class TestClass { - - } - - static class TestApplicationContext extends AbstractApplicationContext { - - private final ConfigurableListableBeanFactory beanFactory = new DefaultListableBeanFactory(); - - @Override - protected void refreshBeanFactory() { - } - - @Override - protected void closeBeanFactory() { - - } - - @Override - public ConfigurableListableBeanFactory getBeanFactory() { - return this.beanFactory; - } - - } - -} diff --git a/module/spring-boot-graphql-test/src/test/java/org/springframework/boot/graphql/test/tester/HttpGraphQlTesterContextCustomizerWithCustomBasePathTests.java b/module/spring-boot-graphql-test/src/test/java/org/springframework/boot/graphql/test/tester/HttpGraphQlTesterContextCustomizerWithCustomBasePathTests.java deleted file mode 100644 index acc5afac599..00000000000 --- a/module/spring-boot-graphql-test/src/test/java/org/springframework/boot/graphql/test/tester/HttpGraphQlTesterContextCustomizerWithCustomBasePathTests.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright 2012-present 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 - * - * https://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.graphql.test.tester; - -import java.util.Collections; -import java.util.Map; - -import org.junit.jupiter.api.Test; -import reactor.core.publisher.Mono; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.tomcat.reactive.TomcatReactiveWebServerFactory; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.io.buffer.DefaultDataBufferFactory; -import org.springframework.graphql.test.tester.HttpGraphQlTester; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.server.reactive.ContextPathCompositeHandler; -import org.springframework.http.server.reactive.HttpHandler; -import org.springframework.http.server.reactive.ServerHttpRequest; -import org.springframework.http.server.reactive.ServerHttpResponse; -import org.springframework.test.context.TestPropertySource; - -/** - * Tests for {@link HttpGraphQlTesterContextCustomizer} with a custom context path for a - * Reactive web application. - * - * @author Brian Clozel - */ -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -@TestPropertySource(properties = { "spring.main.web-application-type=reactive", "spring.webflux.base-path=/test" }) -class HttpGraphQlTesterContextCustomizerWithCustomBasePathTests { - - @Autowired - HttpGraphQlTester graphQlTester; - - @Test - void shouldHandleGraphQlRequests() { - this.graphQlTester.document("{}").executeAndVerify(); - } - - @Configuration(proxyBeanMethods = false) - static class TestConfig { - - @Bean - TomcatReactiveWebServerFactory webServerFactory() { - return new TomcatReactiveWebServerFactory(0); - } - - @Bean - HttpHandler httpHandler() { - TestHandler httpHandler = new TestHandler(); - Map handlersMap = Collections.singletonMap("/test/graphql", httpHandler); - return new ContextPathCompositeHandler(handlersMap); - } - - } - - static class TestHandler implements HttpHandler { - - private static final DefaultDataBufferFactory factory = new DefaultDataBufferFactory(); - - @Override - public Mono handle(ServerHttpRequest request, ServerHttpResponse response) { - response.setStatusCode(HttpStatus.OK); - response.getHeaders().setContentType(MediaType.APPLICATION_JSON); - return response.writeWith(Mono.just(factory.wrap("{\"data\":{}}".getBytes()))); - } - - } - -} diff --git a/module/spring-boot-graphql-test/src/test/java/org/springframework/boot/graphql/test/tester/HttpGraphQlTesterContextCustomizerWithCustomContextPathTests.java b/module/spring-boot-graphql-test/src/test/java/org/springframework/boot/graphql/test/tester/HttpGraphQlTesterContextCustomizerWithCustomContextPathTests.java deleted file mode 100644 index a4a7af81fa5..00000000000 --- a/module/spring-boot-graphql-test/src/test/java/org/springframework/boot/graphql/test/tester/HttpGraphQlTesterContextCustomizerWithCustomContextPathTests.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright 2012-present 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 - * - * https://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.graphql.test.tester; - -import org.junit.jupiter.api.Test; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.tomcat.servlet.TomcatServletWebServerFactory; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; -import org.springframework.graphql.test.tester.HttpGraphQlTester; -import org.springframework.http.MediaType; -import org.springframework.test.context.TestPropertySource; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.servlet.DispatcherServlet; - -/** - * Tests for {@link HttpGraphQlTesterContextCustomizer} with a custom context path for a - * Servlet web application. - * - * @author Brian Clozel - */ -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -@TestPropertySource(properties = "server.servlet.context-path=/test") -class HttpGraphQlTesterContextCustomizerWithCustomContextPathTests { - - @Autowired - HttpGraphQlTester graphQlTester; - - @Test - void shouldHandleGraphQlRequests() { - this.graphQlTester.document("{}").executeAndVerify(); - } - - @Configuration(proxyBeanMethods = false) - @Import(TestController.class) - static class TestConfig { - - @Bean - TomcatServletWebServerFactory webServerFactory() { - TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory(0); - factory.setContextPath("/test"); - return factory; - } - - @Bean - DispatcherServlet dispatcherServlet() { - return new DispatcherServlet(); - } - - } - - @RestController - static class TestController { - - @PostMapping(path = "/graphql", produces = MediaType.APPLICATION_JSON_VALUE) - String graphql() { - return "{}"; - } - - } - -} diff --git a/module/spring-boot-mustache/src/test/java/org/springframework/boot/mustache/autoconfigure/MustacheAutoConfigurationReactiveIntegrationTests.java b/module/spring-boot-mustache/src/test/java/org/springframework/boot/mustache/autoconfigure/MustacheAutoConfigurationReactiveIntegrationTests.java index a5fa34a9187..481af352ca5 100644 --- a/module/spring-boot-mustache/src/test/java/org/springframework/boot/mustache/autoconfigure/MustacheAutoConfigurationReactiveIntegrationTests.java +++ b/module/spring-boot-mustache/src/test/java/org/springframework/boot/mustache/autoconfigure/MustacheAutoConfigurationReactiveIntegrationTests.java @@ -31,6 +31,7 @@ import org.springframework.boot.mustache.reactive.view.MustacheViewResolver; import org.springframework.boot.reactor.netty.autoconfigure.NettyReactiveWebServerAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.webflux.test.autoconfigure.AutoConfigureWebTestClient; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -56,6 +57,7 @@ import static org.assertj.core.api.Assertions.assertThat; * @author Moritz Halbritter */ @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT, properties = "spring.main.web-application-type=reactive") +@AutoConfigureWebTestClient class MustacheAutoConfigurationReactiveIntegrationTests { @Autowired diff --git a/module/spring-boot-webflux-test/src/main/java/org/springframework/boot/webflux/test/autoconfigure/WebTestClientAutoConfiguration.java b/module/spring-boot-webflux-test/src/main/java/org/springframework/boot/webflux/test/autoconfigure/WebTestClientAutoConfiguration.java index d27464c4638..6188e58b42c 100644 --- a/module/spring-boot-webflux-test/src/main/java/org/springframework/boot/webflux/test/autoconfigure/WebTestClientAutoConfiguration.java +++ b/module/spring-boot-webflux-test/src/main/java/org/springframework/boot/webflux/test/autoconfigure/WebTestClientAutoConfiguration.java @@ -26,7 +26,10 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.http.codec.CodecCustomizer; +import org.springframework.boot.test.http.server.BaseUrl; +import org.springframework.boot.test.http.server.BaseUrlProviders; import org.springframework.boot.test.web.reactive.client.WebTestClientBuilderCustomizer; +import org.springframework.boot.test.web.servlet.client.BaseUrlUriBuilderFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.test.web.reactive.server.MockServerConfigurer; @@ -52,17 +55,26 @@ public final class WebTestClientAutoConfiguration { @ConditionalOnBean(WebHandler.class) WebTestClient webTestClient(ApplicationContext applicationContext, List customizers, List configurers) { - WebTestClient.MockServerSpec mockServerSpec = WebTestClient.bindToApplicationContext(applicationContext); - for (MockServerConfigurer configurer : configurers) { - mockServerSpec.apply(configurer); - } - WebTestClient.Builder builder = mockServerSpec.configureClient(); + WebTestClient.Builder builder = prepareBuilder(applicationContext, configurers); for (WebTestClientBuilderCustomizer customizer : customizers) { customizer.customize(builder); } return builder.build(); } + private WebTestClient.Builder prepareBuilder(ApplicationContext applicationContext, + List configurers) { + BaseUrl baseUrl = new BaseUrlProviders(applicationContext).getBaseUrlOrDefault(); + if (baseUrl == BaseUrl.DEFAULT) { + WebTestClient.MockServerSpec mockServerSpec = WebTestClient.bindToApplicationContext(applicationContext); + for (MockServerConfigurer configurer : configurers) { + mockServerSpec.apply(configurer); + } + return mockServerSpec.configureClient(); + } + return WebTestClient.bindToServer().uriBuilderFactory(BaseUrlUriBuilderFactory.get(baseUrl)); + } + @Bean @ConfigurationProperties("spring.test.webtestclient") SpringBootWebTestClientBuilderCustomizer springBootWebTestClientBuilderCustomizer( diff --git a/smoke-test/spring-boot-smoke-test-data-r2dbc/build.gradle b/smoke-test/spring-boot-smoke-test-data-r2dbc/build.gradle index 69010148198..5d6fc8f9c6d 100644 --- a/smoke-test/spring-boot-smoke-test-data-r2dbc/build.gradle +++ b/smoke-test/spring-boot-smoke-test-data-r2dbc/build.gradle @@ -28,4 +28,5 @@ dependencies { runtimeOnly("io.r2dbc:r2dbc-h2") testImplementation(project(":starter:spring-boot-starter-test")) + testImplementation(project(":starter:spring-boot-starter-webflux-test")) } diff --git a/smoke-test/spring-boot-smoke-test-data-r2dbc/src/test/java/smoketest/data/r2dbc/SampleR2dbcApplicationTests.java b/smoke-test/spring-boot-smoke-test-data-r2dbc/src/test/java/smoketest/data/r2dbc/SampleR2dbcApplicationTests.java index f7b8272308f..a1e334b8013 100644 --- a/smoke-test/spring-boot-smoke-test-data-r2dbc/src/test/java/smoketest/data/r2dbc/SampleR2dbcApplicationTests.java +++ b/smoke-test/spring-boot-smoke-test-data-r2dbc/src/test/java/smoketest/data/r2dbc/SampleR2dbcApplicationTests.java @@ -24,12 +24,14 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.webflux.test.autoconfigure.AutoConfigureWebTestClient; import org.springframework.context.ApplicationContext; import org.springframework.test.web.reactive.server.WebTestClient; import static org.assertj.core.api.Assertions.assertThat; @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT, properties = "spring.r2dbc.generate-unique-name=true") +@AutoConfigureWebTestClient class SampleR2dbcApplicationTests { @Autowired diff --git a/smoke-test/spring-boot-smoke-test-reactive-oauth2-client/build.gradle b/smoke-test/spring-boot-smoke-test-reactive-oauth2-client/build.gradle index 67f143b5f5e..5d85b24a9e5 100644 --- a/smoke-test/spring-boot-smoke-test-reactive-oauth2-client/build.gradle +++ b/smoke-test/spring-boot-smoke-test-reactive-oauth2-client/build.gradle @@ -26,5 +26,6 @@ dependencies { implementation(project(":starter:spring-boot-starter-webflux")) testImplementation(project(":starter:spring-boot-starter-test")) + testImplementation(project(":starter:spring-boot-starter-webflux-test")) testImplementation("org.apache.httpcomponents.client5:httpclient5") } diff --git a/smoke-test/spring-boot-smoke-test-reactive-oauth2-client/src/test/java/smoketest/oauth2/client/SampleReactiveOAuth2ClientApplicationTests.java b/smoke-test/spring-boot-smoke-test-reactive-oauth2-client/src/test/java/smoketest/oauth2/client/SampleReactiveOAuth2ClientApplicationTests.java index 348e3fce3b5..6656bd4156f 100644 --- a/smoke-test/spring-boot-smoke-test-reactive-oauth2-client/src/test/java/smoketest/oauth2/client/SampleReactiveOAuth2ClientApplicationTests.java +++ b/smoke-test/spring-boot-smoke-test-reactive-oauth2-client/src/test/java/smoketest/oauth2/client/SampleReactiveOAuth2ClientApplicationTests.java @@ -20,6 +20,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.webflux.test.autoconfigure.AutoConfigureWebTestClient; import org.springframework.test.web.reactive.server.WebTestClient; import static org.assertj.core.api.Assertions.assertThat; @@ -27,6 +28,7 @@ import static org.assertj.core.api.Assertions.assertThat; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, properties = { "APP-CLIENT-ID=my-client-id", "APP-CLIENT-SECRET=my-client-secret", "YAHOO-CLIENT-ID=my-google-client-id", "YAHOO-CLIENT-SECRET=my-google-client-secret" }) +@AutoConfigureWebTestClient class SampleReactiveOAuth2ClientApplicationTests { @Autowired diff --git a/smoke-test/spring-boot-smoke-test-reactive-oauth2-resource-server/build.gradle b/smoke-test/spring-boot-smoke-test-reactive-oauth2-resource-server/build.gradle index 3ccb95ba146..417f1a6d789 100644 --- a/smoke-test/spring-boot-smoke-test-reactive-oauth2-resource-server/build.gradle +++ b/smoke-test/spring-boot-smoke-test-reactive-oauth2-resource-server/build.gradle @@ -25,5 +25,6 @@ dependencies { implementation(project(":starter:spring-boot-starter-webflux")) testImplementation(project(":starter:spring-boot-starter-test")) + testImplementation(project(":starter:spring-boot-starter-webflux-test")) testImplementation("com.squareup.okhttp3:mockwebserver") } diff --git a/smoke-test/spring-boot-smoke-test-reactive-oauth2-resource-server/src/test/java/smoketest/oauth2/resource/SampleReactiveOAuth2ResourceServerApplicationTests.java b/smoke-test/spring-boot-smoke-test-reactive-oauth2-resource-server/src/test/java/smoketest/oauth2/resource/SampleReactiveOAuth2ResourceServerApplicationTests.java index 2e2ac4dc841..f4d7f45b303 100644 --- a/smoke-test/spring-boot-smoke-test-reactive-oauth2-resource-server/src/test/java/smoketest/oauth2/resource/SampleReactiveOAuth2ResourceServerApplicationTests.java +++ b/smoke-test/spring-boot-smoke-test-reactive-oauth2-resource-server/src/test/java/smoketest/oauth2/resource/SampleReactiveOAuth2ResourceServerApplicationTests.java @@ -24,11 +24,13 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.webflux.test.autoconfigure.AutoConfigureWebTestClient; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.test.web.reactive.server.WebTestClient; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +@AutoConfigureWebTestClient class SampleReactiveOAuth2ResourceServerApplicationTests { @Autowired diff --git a/smoke-test/spring-boot-smoke-test-secure-webflux/build.gradle b/smoke-test/spring-boot-smoke-test-secure-webflux/build.gradle index 5b0e88189ae..4a46915e6bc 100644 --- a/smoke-test/spring-boot-smoke-test-secure-webflux/build.gradle +++ b/smoke-test/spring-boot-smoke-test-secure-webflux/build.gradle @@ -26,5 +26,6 @@ dependencies { implementation(project(":starter:spring-boot-starter-webflux")) testImplementation(project(":starter:spring-boot-starter-test")) + testImplementation(project(":starter:spring-boot-starter-webflux-test")) testImplementation("io.projectreactor:reactor-test") } diff --git a/smoke-test/spring-boot-smoke-test-secure-webflux/src/test/java/smoketest/secure/webflux/CorsSampleActuatorApplicationTests.java b/smoke-test/spring-boot-smoke-test-secure-webflux/src/test/java/smoketest/secure/webflux/CorsSampleActuatorApplicationTests.java index b5f1f888626..b659ea679a1 100644 --- a/smoke-test/spring-boot-smoke-test-secure-webflux/src/test/java/smoketest/secure/webflux/CorsSampleActuatorApplicationTests.java +++ b/smoke-test/spring-boot-smoke-test-secure-webflux/src/test/java/smoketest/secure/webflux/CorsSampleActuatorApplicationTests.java @@ -20,6 +20,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.webflux.test.autoconfigure.AutoConfigureWebTestClient; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.web.reactive.server.WebTestClient; @@ -30,6 +31,7 @@ import org.springframework.test.web.reactive.server.WebTestClient; */ @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @ActiveProfiles("cors") +@AutoConfigureWebTestClient class CorsSampleActuatorApplicationTests { @Autowired diff --git a/smoke-test/spring-boot-smoke-test-secure-webflux/src/test/java/smoketest/secure/webflux/ManagementPortSampleSecureWebFluxTests.java b/smoke-test/spring-boot-smoke-test-secure-webflux/src/test/java/smoketest/secure/webflux/ManagementPortSampleSecureWebFluxTests.java index 21420bcd238..656b37ed4a1 100644 --- a/smoke-test/spring-boot-smoke-test-secure-webflux/src/test/java/smoketest/secure/webflux/ManagementPortSampleSecureWebFluxTests.java +++ b/smoke-test/spring-boot-smoke-test-secure-webflux/src/test/java/smoketest/secure/webflux/ManagementPortSampleSecureWebFluxTests.java @@ -28,6 +28,7 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.boot.test.web.server.LocalManagementPort; import org.springframework.boot.test.web.server.LocalServerPort; +import org.springframework.boot.webflux.test.autoconfigure.AutoConfigureWebTestClient; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.web.server.ServerHttpSecurity; @@ -42,8 +43,10 @@ import static org.springframework.security.config.Customizer.withDefaults; * * @author Madhura Bhave */ -@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT, properties = { "management.server.port=0" }, classes = { - ManagementPortSampleSecureWebFluxTests.SecurityConfiguration.class, SampleSecureWebFluxApplication.class }) +@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT, properties = { "management.server.port=0" }, + classes = { ManagementPortSampleSecureWebFluxTests.SecurityConfiguration.class, + SampleSecureWebFluxApplication.class }) +@AutoConfigureWebTestClient class ManagementPortSampleSecureWebFluxTests { @LocalServerPort diff --git a/smoke-test/spring-boot-smoke-test-secure-webflux/src/test/java/smoketest/secure/webflux/SampleSecureWebFluxApplicationTests.java b/smoke-test/spring-boot-smoke-test-secure-webflux/src/test/java/smoketest/secure/webflux/SampleSecureWebFluxApplicationTests.java index 1642b0d944b..6ac240a3580 100644 --- a/smoke-test/spring-boot-smoke-test-secure-webflux/src/test/java/smoketest/secure/webflux/SampleSecureWebFluxApplicationTests.java +++ b/smoke-test/spring-boot-smoke-test-secure-webflux/src/test/java/smoketest/secure/webflux/SampleSecureWebFluxApplicationTests.java @@ -22,6 +22,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.webflux.test.autoconfigure.AutoConfigureWebTestClient; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.test.web.reactive.server.WebTestClient; @@ -33,6 +34,7 @@ import org.springframework.test.web.reactive.server.WebTestClient; */ @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, properties = "management.endpoint.health.show-details=never") +@AutoConfigureWebTestClient class SampleSecureWebFluxApplicationTests { @Autowired diff --git a/smoke-test/spring-boot-smoke-test-secure-webflux/src/test/java/smoketest/secure/webflux/SampleSecureWebFluxCustomSecurityTests.java b/smoke-test/spring-boot-smoke-test-secure-webflux/src/test/java/smoketest/secure/webflux/SampleSecureWebFluxCustomSecurityTests.java index 2e9553ae557..b6a73c944eb 100644 --- a/smoke-test/spring-boot-smoke-test-secure-webflux/src/test/java/smoketest/secure/webflux/SampleSecureWebFluxCustomSecurityTests.java +++ b/smoke-test/spring-boot-smoke-test-secure-webflux/src/test/java/smoketest/secure/webflux/SampleSecureWebFluxCustomSecurityTests.java @@ -25,6 +25,7 @@ import org.springframework.boot.actuate.web.mappings.MappingsEndpoint; import org.springframework.boot.security.autoconfigure.actuate.reactive.EndpointRequest; import org.springframework.boot.security.autoconfigure.reactive.PathRequest; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.webflux.test.autoconfigure.AutoConfigureWebTestClient; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpStatus; @@ -42,8 +43,10 @@ import static org.springframework.security.config.Customizer.withDefaults; * * @author Madhura Bhave */ -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = { - SampleSecureWebFluxCustomSecurityTests.SecurityConfiguration.class, SampleSecureWebFluxApplication.class }) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, + classes = { SampleSecureWebFluxCustomSecurityTests.SecurityConfiguration.class, + SampleSecureWebFluxApplication.class }) +@AutoConfigureWebTestClient class SampleSecureWebFluxCustomSecurityTests { @Autowired diff --git a/smoke-test/spring-boot-smoke-test-webflux-coroutines/build.gradle b/smoke-test/spring-boot-smoke-test-webflux-coroutines/build.gradle index b2ca8f106d7..95badc7e2be 100644 --- a/smoke-test/spring-boot-smoke-test-webflux-coroutines/build.gradle +++ b/smoke-test/spring-boot-smoke-test-webflux-coroutines/build.gradle @@ -29,6 +29,7 @@ dependencies { implementation("org.jetbrains.kotlinx:kotlinx-coroutines-reactor") testImplementation(project(":starter:spring-boot-starter-test")) + testImplementation(project(":starter:spring-boot-starter-webflux-test")) testImplementation("io.projectreactor:reactor-test") } diff --git a/smoke-test/spring-boot-smoke-test-webflux-coroutines/src/test/kotlin/smoketest/coroutines/CoroutinesControllerTests.kt b/smoke-test/spring-boot-smoke-test-webflux-coroutines/src/test/kotlin/smoketest/coroutines/CoroutinesControllerTests.kt index 3c128cb1a3f..8db5abd9d49 100644 --- a/smoke-test/spring-boot-smoke-test-webflux-coroutines/src/test/kotlin/smoketest/coroutines/CoroutinesControllerTests.kt +++ b/smoke-test/spring-boot-smoke-test-webflux-coroutines/src/test/kotlin/smoketest/coroutines/CoroutinesControllerTests.kt @@ -23,8 +23,10 @@ import org.springframework.boot.test.context.SpringBootTest.WebEnvironment import org.springframework.http.MediaType import org.springframework.test.web.reactive.server.WebTestClient import org.springframework.test.web.reactive.server.expectBody +import org.springframework.boot.webflux.test.autoconfigure.AutoConfigureWebTestClient @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) +@AutoConfigureWebTestClient class CoroutinesControllerTests(@Autowired private val webClient: WebTestClient) { @Test diff --git a/smoke-test/spring-boot-smoke-test-webflux/build.gradle b/smoke-test/spring-boot-smoke-test-webflux/build.gradle index f13da15a448..d2b360abe64 100644 --- a/smoke-test/spring-boot-smoke-test-webflux/build.gradle +++ b/smoke-test/spring-boot-smoke-test-webflux/build.gradle @@ -27,5 +27,6 @@ dependencies { testImplementation(project(":starter:spring-boot-starter-restclient-test")) testImplementation(project(":starter:spring-boot-starter-test")) + testImplementation(project(":starter:spring-boot-starter-webflux-test")) testImplementation("io.projectreactor:reactor-test") } diff --git a/smoke-test/spring-boot-smoke-test-webflux/src/test/java/smoketest/webflux/SampleWebFluxApplicationActuatorIsolatedObjectMapperFalseTests.java b/smoke-test/spring-boot-smoke-test-webflux/src/test/java/smoketest/webflux/SampleWebFluxApplicationActuatorIsolatedObjectMapperFalseTests.java index 241129eccbe..9fe9e6a0312 100644 --- a/smoke-test/spring-boot-smoke-test-webflux/src/test/java/smoketest/webflux/SampleWebFluxApplicationActuatorIsolatedObjectMapperFalseTests.java +++ b/smoke-test/spring-boot-smoke-test-webflux/src/test/java/smoketest/webflux/SampleWebFluxApplicationActuatorIsolatedObjectMapperFalseTests.java @@ -21,6 +21,7 @@ import tools.jackson.databind.ObjectMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.webflux.test.autoconfigure.AutoConfigureWebTestClient; import org.springframework.http.MediaType; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.web.reactive.server.WebTestClient; @@ -34,6 +35,7 @@ import org.springframework.test.web.reactive.server.WebTestClient; properties = { "management.endpoints.jackson.isolated-object-mapper=false", "spring.jackson.mapper.require-setters-for-getters=true" }) @ContextConfiguration(loader = ApplicationStartupSpringBootContextLoader.class) +@AutoConfigureWebTestClient class SampleWebFluxApplicationActuatorIsolatedObjectMapperFalseTests { @Autowired diff --git a/smoke-test/spring-boot-smoke-test-webflux/src/test/java/smoketest/webflux/SampleWebFluxApplicationActuatorIsolatedObjectMapperTrueTests.java b/smoke-test/spring-boot-smoke-test-webflux/src/test/java/smoketest/webflux/SampleWebFluxApplicationActuatorIsolatedObjectMapperTrueTests.java index 515699edc03..b68fe3c2264 100644 --- a/smoke-test/spring-boot-smoke-test-webflux/src/test/java/smoketest/webflux/SampleWebFluxApplicationActuatorIsolatedObjectMapperTrueTests.java +++ b/smoke-test/spring-boot-smoke-test-webflux/src/test/java/smoketest/webflux/SampleWebFluxApplicationActuatorIsolatedObjectMapperTrueTests.java @@ -23,6 +23,7 @@ import tools.jackson.databind.ObjectMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.webflux.test.autoconfigure.AutoConfigureWebTestClient; import org.springframework.http.MediaType; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.web.reactive.server.EntityExchangeResult; @@ -39,6 +40,7 @@ import static org.assertj.core.api.Assertions.assertThat; properties = { "management.endpoints.jackson.isolated-object-mapper=true", "spring.jackson.mapper.require-setters-for-getters=true" }) @ContextConfiguration(loader = ApplicationStartupSpringBootContextLoader.class) +@AutoConfigureWebTestClient class SampleWebFluxApplicationActuatorIsolatedObjectMapperTrueTests { @Autowired diff --git a/smoke-test/spring-boot-smoke-test-webflux/src/test/java/smoketest/webflux/SampleWebFluxApplicationTests.java b/smoke-test/spring-boot-smoke-test-webflux/src/test/java/smoketest/webflux/SampleWebFluxApplicationTests.java index 909b41f5ee6..92887e5ede8 100644 --- a/smoke-test/spring-boot-smoke-test-webflux/src/test/java/smoketest/webflux/SampleWebFluxApplicationTests.java +++ b/smoke-test/spring-boot-smoke-test-webflux/src/test/java/smoketest/webflux/SampleWebFluxApplicationTests.java @@ -22,6 +22,7 @@ import reactor.core.publisher.Mono; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.webflux.test.autoconfigure.AutoConfigureWebTestClient; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.test.web.reactive.server.WebTestClient; @@ -34,6 +35,7 @@ import static org.assertj.core.api.Assertions.assertThat; * @author Brian Clozel */ @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT, properties = "server.error.include-message=always") +@AutoConfigureWebTestClient class SampleWebFluxApplicationTests { @Autowired