Remove `spring-boot-web-server-test` module
Remove the `spring-boot-web-server-test` module, adding `SpringBootTestRandomPortContextCustomizerFactory` to `spring-boot-web-server` as a replacement for `SpringBootTestRandomPortApplicationListener`. See gh-46356 See gh-47322
This commit is contained in:
parent
3cced515ce
commit
2a521ce4e9
|
@ -59,7 +59,7 @@ import org.springframework.web.context.WebApplicationContext;
|
||||||
* <li>Provides support for different {@link #webEnvironment() webEnvironment} modes,
|
* <li>Provides support for different {@link #webEnvironment() webEnvironment} modes,
|
||||||
* including the ability to start a fully running web server listening on a
|
* including the ability to start a fully running web server listening on a
|
||||||
* {@link WebEnvironment#DEFINED_PORT defined} or {@link WebEnvironment#RANDOM_PORT
|
* {@link WebEnvironment#DEFINED_PORT defined} or {@link WebEnvironment#RANDOM_PORT
|
||||||
* random} port when {@code spring-boot-web-server-test} is on the classpath.</li>
|
* random} port when {@code spring-boot-web-server} is on the classpath.</li>
|
||||||
* </ul>
|
* </ul>
|
||||||
*
|
*
|
||||||
* @author Phillip Webb
|
* @author Phillip Webb
|
||||||
|
@ -144,7 +144,7 @@ public @interface SpringBootTest {
|
||||||
* Creates a web application context (reactive or servlet based) and sets a
|
* Creates a web application context (reactive or servlet based) and sets a
|
||||||
* {@code server.port=0} {@link Environment} property (which usually triggers
|
* {@code server.port=0} {@link Environment} property (which usually triggers
|
||||||
* listening on a random port). Requires a dependency on
|
* listening on a random port). Requires a dependency on
|
||||||
* {@code spring-boot-web-server-test}. Often used in conjunction with a
|
* {@code spring-boot-web-server}. Often used in conjunction with a
|
||||||
* {@code @LocalServerPort} injected field on the test.
|
* {@code @LocalServerPort} injected field on the test.
|
||||||
*/
|
*/
|
||||||
RANDOM_PORT(true),
|
RANDOM_PORT(true),
|
||||||
|
@ -152,7 +152,7 @@ public @interface SpringBootTest {
|
||||||
/**
|
/**
|
||||||
* Creates a web application context (reactive or servlet based) without defining
|
* Creates a web application context (reactive or servlet based) without defining
|
||||||
* any {@code server.port=0} {@link Environment} property. Requires a dependency
|
* any {@code server.port=0} {@link Environment} property. Requires a dependency
|
||||||
* on {@code spring-boot-web-server-test}.
|
* on {@code spring-boot-web-server}.
|
||||||
*/
|
*/
|
||||||
DEFINED_PORT(true),
|
DEFINED_PORT(true),
|
||||||
|
|
||||||
|
|
|
@ -37,7 +37,6 @@ dependencies {
|
||||||
testImplementation(project(":module:spring-boot-reactor-netty"))
|
testImplementation(project(":module:spring-boot-reactor-netty"))
|
||||||
testImplementation(project(":module:spring-boot-session"))
|
testImplementation(project(":module:spring-boot-session"))
|
||||||
testImplementation(project(":module:spring-boot-tomcat"))
|
testImplementation(project(":module:spring-boot-tomcat"))
|
||||||
testImplementation(project(":module:spring-boot-web-server-test"))
|
|
||||||
testImplementation(project(":module:spring-boot-webflux"))
|
testImplementation(project(":module:spring-boot-webflux"))
|
||||||
testImplementation(project(":module:spring-boot-webmvc"))
|
testImplementation(project(":module:spring-boot-webmvc"))
|
||||||
testImplementation(project(":test-support:spring-boot-test-support"))
|
testImplementation(project(":test-support:spring-boot-test-support"))
|
||||||
|
|
|
@ -125,7 +125,6 @@ dependencies {
|
||||||
implementation(project(path: ":module:spring-boot-restclient-test"))
|
implementation(project(path: ":module:spring-boot-restclient-test"))
|
||||||
implementation(project(path: ":module:spring-boot-security"))
|
implementation(project(path: ":module:spring-boot-security"))
|
||||||
implementation(project(path: ":module:spring-boot-tomcat"))
|
implementation(project(path: ":module:spring-boot-tomcat"))
|
||||||
implementation(project(path: ":module:spring-boot-web-server-test"))
|
|
||||||
implementation(project(path: ":module:spring-boot-webclient"))
|
implementation(project(path: ":module:spring-boot-webclient"))
|
||||||
implementation(project(path: ":module:spring-boot-webflux"))
|
implementation(project(path: ":module:spring-boot-webflux"))
|
||||||
implementation(project(path: ":module:spring-boot-webflux-test"))
|
implementation(project(path: ":module:spring-boot-webflux-test"))
|
||||||
|
|
|
@ -64,9 +64,6 @@ Spring Boot offers several focused, feature-specific `-test` modules:
|
||||||
|`spring-boot-security-test`
|
|`spring-boot-security-test`
|
||||||
|Testing applications that use Spring Security.
|
|Testing applications that use Spring Security.
|
||||||
|
|
||||||
|`spring-boot-web-server-test`
|
|
||||||
|Testing applications that use an embedded web server.
|
|
||||||
|
|
||||||
|`spring-boot-webflux-test`
|
|`spring-boot-webflux-test`
|
||||||
|Testing applications that use Spring WebFlux. Provides the `@WebFluxTest` test slice.
|
|Testing applications that use Spring WebFlux. Provides the `@WebFluxTest` test slice.
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,6 @@ dependencies {
|
||||||
testImplementation(project(":module:spring-boot-restclient-test"))
|
testImplementation(project(":module:spring-boot-restclient-test"))
|
||||||
testImplementation(project(":module:spring-boot-tomcat"))
|
testImplementation(project(":module:spring-boot-tomcat"))
|
||||||
testImplementation(project(":module:spring-boot-web-server"))
|
testImplementation(project(":module:spring-boot-web-server"))
|
||||||
testImplementation(project(":module:spring-boot-web-server-test"))
|
|
||||||
testImplementation("io.projectreactor.netty:reactor-netty-http")
|
testImplementation("io.projectreactor.netty:reactor-netty-http")
|
||||||
testImplementation("org.springframework:spring-webmvc")
|
testImplementation("org.springframework:spring-webmvc")
|
||||||
testImplementation("org.springframework:spring-webflux")
|
testImplementation("org.springframework:spring-webflux")
|
||||||
|
|
|
@ -56,7 +56,6 @@ dependencies {
|
||||||
intTestImplementation(project(":core:spring-boot-test"))
|
intTestImplementation(project(":core:spring-boot-test"))
|
||||||
intTestImplementation(project(":module:spring-boot-restclient"))
|
intTestImplementation(project(":module:spring-boot-restclient"))
|
||||||
intTestImplementation(project(":module:spring-boot-restclient-test"))
|
intTestImplementation(project(":module:spring-boot-restclient-test"))
|
||||||
intTestImplementation(project(":module:spring-boot-web-server-test"))
|
|
||||||
intTestImplementation(project(":test-support:spring-boot-test-support"))
|
intTestImplementation(project(":test-support:spring-boot-test-support"))
|
||||||
intTestImplementation("org.apache.httpcomponents.client5:httpclient5")
|
intTestImplementation("org.apache.httpcomponents.client5:httpclient5")
|
||||||
intTestImplementation("net.bytebuddy:byte-buddy")
|
intTestImplementation("net.bytebuddy:byte-buddy")
|
||||||
|
|
|
@ -42,7 +42,6 @@ dependencies {
|
||||||
testImplementation(project(":module:spring-boot-tomcat"))
|
testImplementation(project(":module:spring-boot-tomcat"))
|
||||||
testImplementation(project(":module:spring-boot-webflux-test"))
|
testImplementation(project(":module:spring-boot-webflux-test"))
|
||||||
testImplementation(project(":module:spring-boot-webmvc-test"))
|
testImplementation(project(":module:spring-boot-webmvc-test"))
|
||||||
testImplementation(project(":module:spring-boot-web-server-test"))
|
|
||||||
testImplementation(project(":test-support:spring-boot-test-support"))
|
testImplementation(project(":test-support:spring-boot-test-support"))
|
||||||
testImplementation(testFixtures(project(":core:spring-boot-autoconfigure")))
|
testImplementation(testFixtures(project(":core:spring-boot-autoconfigure")))
|
||||||
testImplementation("io.projectreactor:reactor-test")
|
testImplementation("io.projectreactor:reactor-test")
|
||||||
|
|
|
@ -30,7 +30,6 @@ dependencies {
|
||||||
optional(project(":core:spring-boot-autoconfigure"))
|
optional(project(":core:spring-boot-autoconfigure"))
|
||||||
optional(project(":core:spring-boot-test-autoconfigure"))
|
optional(project(":core:spring-boot-test-autoconfigure"))
|
||||||
optional(project(":module:spring-boot-webmvc-test"))
|
optional(project(":module:spring-boot-webmvc-test"))
|
||||||
optional(project(":module:spring-boot-web-server-test"))
|
|
||||||
optional("org.springframework.restdocs:spring-restdocs-mockmvc")
|
optional("org.springframework.restdocs:spring-restdocs-mockmvc")
|
||||||
optional("org.springframework.restdocs:spring-restdocs-restassured")
|
optional("org.springframework.restdocs:spring-restdocs-restassured")
|
||||||
optional("org.springframework.restdocs:spring-restdocs-webtestclient")
|
optional("org.springframework.restdocs:spring-restdocs-webtestclient")
|
||||||
|
|
|
@ -35,7 +35,6 @@ dependencies {
|
||||||
optional(project(":module:spring-boot-reactor"))
|
optional(project(":module:spring-boot-reactor"))
|
||||||
optional(project(":module:spring-boot-webflux-test"))
|
optional(project(":module:spring-boot-webflux-test"))
|
||||||
optional(project(":module:spring-boot-webmvc-test"))
|
optional(project(":module:spring-boot-webmvc-test"))
|
||||||
optional(project(":module:spring-boot-web-server-test"))
|
|
||||||
|
|
||||||
testImplementation(project(":core:spring-boot-test-autoconfigure"))
|
testImplementation(project(":core:spring-boot-test-autoconfigure"))
|
||||||
testImplementation(project(":module:spring-boot-tomcat"))
|
testImplementation(project(":module:spring-boot-tomcat"))
|
||||||
|
|
|
@ -40,7 +40,6 @@ dependencies {
|
||||||
optional(project(":module:spring-boot-webflux"))
|
optional(project(":module:spring-boot-webflux"))
|
||||||
optional(project(":module:spring-boot-webmvc"))
|
optional(project(":module:spring-boot-webmvc"))
|
||||||
optional(project(":module:spring-boot-web-server"))
|
optional(project(":module:spring-boot-web-server"))
|
||||||
optional(project(":module:spring-boot-web-server-test"))
|
|
||||||
optional("jakarta.servlet:jakarta.servlet-api")
|
optional("jakarta.servlet:jakarta.servlet-api")
|
||||||
optional("org.springframework:spring-messaging")
|
optional("org.springframework:spring-messaging")
|
||||||
optional("org.springframework:spring-webflux")
|
optional("org.springframework:spring-webflux")
|
||||||
|
@ -56,7 +55,6 @@ dependencies {
|
||||||
testImplementation(project(":module:spring-boot-restclient"))
|
testImplementation(project(":module:spring-boot-restclient"))
|
||||||
testImplementation(project(":module:spring-boot-rsocket"))
|
testImplementation(project(":module:spring-boot-rsocket"))
|
||||||
testImplementation(project(":module:spring-boot-tomcat"))
|
testImplementation(project(":module:spring-boot-tomcat"))
|
||||||
testImplementation(project(":module:spring-boot-web-server-test"))
|
|
||||||
testImplementation(project(":test-support:spring-boot-test-support"))
|
testImplementation(project(":test-support:spring-boot-test-support"))
|
||||||
testImplementation(testFixtures(project(":core:spring-boot-autoconfigure")))
|
testImplementation(testFixtures(project(":core:spring-boot-autoconfigure")))
|
||||||
testImplementation("com.squareup.okhttp3:mockwebserver")
|
testImplementation("com.squareup.okhttp3:mockwebserver")
|
||||||
|
|
|
@ -1,57 +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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
plugins {
|
|
||||||
id "dev.adamko.dokkatoo-html"
|
|
||||||
id "java-library"
|
|
||||||
id "org.springframework.boot.deployed"
|
|
||||||
id "org.springframework.boot.optional-dependencies"
|
|
||||||
id "org.springframework.boot.test-auto-configuration"
|
|
||||||
}
|
|
||||||
|
|
||||||
description = "Spring Boot Web Server Test"
|
|
||||||
|
|
||||||
dependencies {
|
|
||||||
api(project(":core:spring-boot"))
|
|
||||||
api(project(":core:spring-boot-test-autoconfigure"))
|
|
||||||
|
|
||||||
optional(project(":core:spring-boot-autoconfigure"))
|
|
||||||
optional(project(":module:spring-boot-http-codec"))
|
|
||||||
optional(project(":module:spring-boot-restclient"))
|
|
||||||
optional(project(":module:spring-boot-web-server"))
|
|
||||||
optional(project(":module:spring-boot-webclient"))
|
|
||||||
optional("jakarta.servlet:jakarta.servlet-api")
|
|
||||||
optional("org.htmlunit:htmlunit")
|
|
||||||
optional("org.jetbrains.kotlin:kotlin-reflect")
|
|
||||||
optional("org.jetbrains.kotlin:kotlin-stdlib")
|
|
||||||
optional("org.seleniumhq.selenium:htmlunit3-driver") {
|
|
||||||
exclude(group: "com.sun.activation", module: "jakarta.activation")
|
|
||||||
}
|
|
||||||
optional("org.seleniumhq.selenium:selenium-api")
|
|
||||||
optional("org.springframework:spring-test")
|
|
||||||
optional("org.springframework:spring-web")
|
|
||||||
optional("org.springframework:spring-webflux")
|
|
||||||
optional("org.springframework.security:spring-security-test")
|
|
||||||
|
|
||||||
testImplementation(project(":core:spring-boot-test"))
|
|
||||||
testImplementation(project(":module:spring-boot-tomcat"))
|
|
||||||
testImplementation(project(":test-support:spring-boot-test-support"))
|
|
||||||
testImplementation("io.mockk:mockk")
|
|
||||||
testImplementation("io.projectreactor.netty:reactor-netty-http")
|
|
||||||
testImplementation("org.springframework:spring-webmvc")
|
|
||||||
|
|
||||||
testRuntimeOnly("ch.qos.logback:logback-classic")
|
|
||||||
}
|
|
|
@ -1,113 +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.web.server.test;
|
|
||||||
|
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
import org.jspecify.annotations.Nullable;
|
|
||||||
|
|
||||||
import org.springframework.boot.EnvironmentPostProcessor;
|
|
||||||
import org.springframework.boot.SpringApplication;
|
|
||||||
import org.springframework.core.convert.ConversionFailedException;
|
|
||||||
import org.springframework.core.env.ConfigurableEnvironment;
|
|
||||||
import org.springframework.core.env.MapPropertySource;
|
|
||||||
import org.springframework.core.env.PropertySource;
|
|
||||||
import org.springframework.lang.Contract;
|
|
||||||
import org.springframework.test.context.support.TestPropertySourceUtils;
|
|
||||||
import org.springframework.util.ClassUtils;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@link EnvironmentPostProcessor} implementation to start the management context on a
|
|
||||||
* random port if the main server's port is 0 and the management context is expected on a
|
|
||||||
* different port.
|
|
||||||
*
|
|
||||||
* @author Madhura Bhave
|
|
||||||
* @author Andy Wilkinson
|
|
||||||
*/
|
|
||||||
class SpringBootTestRandomPortEnvironmentPostProcessor implements EnvironmentPostProcessor {
|
|
||||||
|
|
||||||
private static final String MANAGEMENT_PORT_PROPERTY = "management.server.port";
|
|
||||||
|
|
||||||
private static final String SERVER_PORT_PROPERTY = "server.port";
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
|
|
||||||
MapPropertySource source = (MapPropertySource) environment.getPropertySources()
|
|
||||||
.get(TestPropertySourceUtils.INLINED_PROPERTIES_PROPERTY_SOURCE_NAME);
|
|
||||||
if (source == null || isTestServerPortFixed(source, environment) || isTestManagementPortConfigured(source)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
Integer managementPort = getPropertyAsInteger(environment, MANAGEMENT_PORT_PROPERTY, null);
|
|
||||||
if (managementPort == null || managementPort.equals(-1) || managementPort.equals(0)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
Integer serverPort = getPropertyAsInteger(environment, SERVER_PORT_PROPERTY, 8080);
|
|
||||||
if (!managementPort.equals(serverPort)) {
|
|
||||||
source.getSource().put(MANAGEMENT_PORT_PROPERTY, "0");
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
source.getSource().put(MANAGEMENT_PORT_PROPERTY, "");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isTestServerPortFixed(MapPropertySource source, ConfigurableEnvironment environment) {
|
|
||||||
return !Integer.valueOf(0).equals(getPropertyAsInteger(source, SERVER_PORT_PROPERTY, environment));
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isTestManagementPortConfigured(PropertySource<?> source) {
|
|
||||||
return source.getProperty(MANAGEMENT_PORT_PROPERTY) != null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Contract("_, _, !null -> !null")
|
|
||||||
private @Nullable Integer getPropertyAsInteger(ConfigurableEnvironment environment, String property,
|
|
||||||
@Nullable Integer defaultValue) {
|
|
||||||
return environment.getPropertySources()
|
|
||||||
.stream()
|
|
||||||
.filter((source) -> !source.getName()
|
|
||||||
.equals(TestPropertySourceUtils.INLINED_PROPERTIES_PROPERTY_SOURCE_NAME))
|
|
||||||
.map((source) -> getPropertyAsInteger(source, property, environment))
|
|
||||||
.filter(Objects::nonNull)
|
|
||||||
.findFirst()
|
|
||||||
.orElse(defaultValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
private @Nullable Integer getPropertyAsInteger(PropertySource<?> source, String property,
|
|
||||||
ConfigurableEnvironment environment) {
|
|
||||||
Object value = source.getProperty(property);
|
|
||||||
if (value == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
if (ClassUtils.isAssignableValue(Integer.class, value)) {
|
|
||||||
return (Integer) value;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
return environment.getConversionService().convert(value, Integer.class);
|
|
||||||
}
|
|
||||||
catch (ConversionFailedException ex) {
|
|
||||||
if (value instanceof String string) {
|
|
||||||
return getResolvedValueIfPossible(environment, string);
|
|
||||||
}
|
|
||||||
throw ex;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private @Nullable Integer getResolvedValueIfPossible(ConfigurableEnvironment environment, String value) {
|
|
||||||
String resolvedValue = environment.resolveRequiredPlaceholders(value);
|
|
||||||
return environment.getConversionService().convert(resolvedValue, Integer.class);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Web server test utilities and support classes.
|
|
||||||
*/
|
|
||||||
@NullMarked
|
|
||||||
package org.springframework.boot.web.server.test;
|
|
||||||
|
|
||||||
import org.jspecify.annotations.NullMarked;
|
|
|
@ -1,265 +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.web.server.test.client
|
|
||||||
|
|
||||||
import io.mockk.mockk
|
|
||||||
import io.mockk.verify
|
|
||||||
import org.assertj.core.api.Assertions.assertThat
|
|
||||||
import org.junit.jupiter.api.Test
|
|
||||||
import org.springframework.core.ParameterizedTypeReference
|
|
||||||
import org.springframework.http.HttpEntity
|
|
||||||
import org.springframework.http.HttpMethod
|
|
||||||
import org.springframework.http.RequestEntity
|
|
||||||
import org.springframework.util.ReflectionUtils
|
|
||||||
import org.springframework.web.client.RestOperations
|
|
||||||
import java.net.URI
|
|
||||||
import kotlin.reflect.full.createType
|
|
||||||
import kotlin.reflect.jvm.kotlinFunction
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Mock object based tests for [TestRestTemplate] Kotlin extensions
|
|
||||||
*
|
|
||||||
* @author Sebastien Deleuze
|
|
||||||
*/
|
|
||||||
class TestRestTemplateExtensionsTests {
|
|
||||||
|
|
||||||
val template = mockk<TestRestTemplate>(relaxed = true)
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `getForObject with reified type parameters, String and varargs`() {
|
|
||||||
val url = "https://spring.io"
|
|
||||||
val var1 = "var1"
|
|
||||||
val var2 = "var2"
|
|
||||||
template.getForObject<Foo>(url, var1, var2)
|
|
||||||
template.restTemplate
|
|
||||||
verify(exactly = 1) { template.getForObject(url, Foo::class.java, var1, var2) }
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `getForObject with reified type parameters, String and Map`() {
|
|
||||||
val url = "https://spring.io"
|
|
||||||
val vars = mapOf(Pair("key1", "value1"), Pair("key2", "value2"))
|
|
||||||
template.getForObject<Foo>(url, vars)
|
|
||||||
verify(exactly = 1) { template.getForObject(url, Foo::class.java, vars) }
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `getForObject with reified type parameters and URI`() {
|
|
||||||
val url = URI("https://spring.io")
|
|
||||||
template.getForObject<Foo>(url)
|
|
||||||
verify(exactly = 1) { template.getForObject(url, Foo::class.java) }
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `getForEntity with reified type parameters and URI`() {
|
|
||||||
val url = URI("https://spring.io")
|
|
||||||
template.getForEntity<Foo>(url)
|
|
||||||
verify(exactly = 1) { template.getForEntity(url, Foo::class.java) }
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `getForEntity with reified type parameters, String and varargs`() {
|
|
||||||
val url = "https://spring.io"
|
|
||||||
val var1 = "var1"
|
|
||||||
val var2 = "var2"
|
|
||||||
template.getForEntity<Foo>(url, var1, var2)
|
|
||||||
verify(exactly = 1) { template.getForEntity(url, Foo::class.java, var1, var2) }
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `getForEntity with reified type parameters, String and Map`() {
|
|
||||||
val url = "https://spring.io"
|
|
||||||
val vars = mapOf(Pair("key1", "value1"), Pair("key2", "value2"))
|
|
||||||
template.getForEntity<Foo>(url, vars)
|
|
||||||
verify(exactly = 1) { template.getForEntity(url, Foo::class.java, vars) }
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `patchForObject with reified type parameters, String, Any and varargs`() {
|
|
||||||
val url = "https://spring.io"
|
|
||||||
val body: Any = "body"
|
|
||||||
val var1 = "var1"
|
|
||||||
val var2 = "var2"
|
|
||||||
template.patchForObject<Foo>(url, body, var1, var2)
|
|
||||||
verify(exactly = 1) { template.patchForObject(url, body, Foo::class.java, var1, var2) }
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `patchForObject with reified type parameters, String, Any and Map`() {
|
|
||||||
val url = "https://spring.io"
|
|
||||||
val body: Any = "body"
|
|
||||||
val vars = mapOf(Pair("key1", "value1"), Pair("key2", "value2"))
|
|
||||||
template.patchForObject<Foo>(url, body, vars)
|
|
||||||
verify(exactly = 1) { template.patchForObject(url, body, Foo::class.java, vars) }
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `patchForObject with reified type parameters, String and Any`() {
|
|
||||||
val url = "https://spring.io"
|
|
||||||
val body: Any = "body"
|
|
||||||
template.patchForObject<Foo>(url, body)
|
|
||||||
verify(exactly = 1) { template.patchForObject(url, body, Foo::class.java) }
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `patchForObject with reified type parameters`() {
|
|
||||||
val url = "https://spring.io"
|
|
||||||
template.patchForObject<Foo>(url)
|
|
||||||
verify(exactly = 1) { template.patchForObject(url, null, Foo::class.java) }
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `postForObject with reified type parameters, String, Any and varargs`() {
|
|
||||||
val url = "https://spring.io"
|
|
||||||
val body: Any = "body"
|
|
||||||
val var1 = "var1"
|
|
||||||
val var2 = "var2"
|
|
||||||
template.postForObject<Foo>(url, body, var1, var2)
|
|
||||||
verify(exactly = 1) { template.postForObject(url, body, Foo::class.java, var1, var2) }
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `postForObject with reified type parameters, String, Any and Map`() {
|
|
||||||
val url = "https://spring.io"
|
|
||||||
val body: Any = "body"
|
|
||||||
val vars = mapOf(Pair("key1", "value1"), Pair("key2", "value2"))
|
|
||||||
template.postForObject<Foo>(url, body, vars)
|
|
||||||
verify(exactly = 1) { template.postForObject(url, body, Foo::class.java, vars) }
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `postForObject with reified type parameters, String and Any`() {
|
|
||||||
val url = "https://spring.io"
|
|
||||||
val body: Any = "body"
|
|
||||||
template.postForObject<Foo>(url, body)
|
|
||||||
verify(exactly = 1) { template.postForObject(url, body, Foo::class.java) }
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `postForObject with reified type parameters`() {
|
|
||||||
val url = "https://spring.io"
|
|
||||||
template.postForObject<Foo>(url)
|
|
||||||
verify(exactly = 1) { template.postForObject(url, null, Foo::class.java) }
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `postForEntity with reified type parameters, String, Any and varargs`() {
|
|
||||||
val url = "https://spring.io"
|
|
||||||
val body: Any = "body"
|
|
||||||
val var1 = "var1"
|
|
||||||
val var2 = "var2"
|
|
||||||
template.postForEntity<Foo>(url, body, var1, var2)
|
|
||||||
verify(exactly = 1) { template.postForEntity(url, body, Foo::class.java, var1, var2) }
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `postForEntity with reified type parameters, String, Any and Map`() {
|
|
||||||
val url = "https://spring.io"
|
|
||||||
val body: Any = "body"
|
|
||||||
val vars = mapOf(Pair("key1", "value1"), Pair("key2", "value2"))
|
|
||||||
template.postForEntity<Foo>(url, body, vars)
|
|
||||||
verify(exactly = 1) { template.postForEntity(url, body, Foo::class.java, vars) }
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `postForEntity with reified type parameters, String and Any`() {
|
|
||||||
val url = "https://spring.io"
|
|
||||||
val body: Any = "body"
|
|
||||||
template.postForEntity<Foo>(url, body)
|
|
||||||
verify(exactly = 1) { template.postForEntity(url, body, Foo::class.java) }
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `postForEntity with reified type parameters`() {
|
|
||||||
val url = "https://spring.io"
|
|
||||||
template.postForEntity<Foo>(url)
|
|
||||||
verify(exactly = 1) { template.postForEntity(url, null, Foo::class.java) }
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `exchange with reified type parameters, String, HttpMethod, HttpEntity and varargs`() {
|
|
||||||
val url = "https://spring.io"
|
|
||||||
val method = HttpMethod.GET
|
|
||||||
val entity = mockk<HttpEntity<Foo>>()
|
|
||||||
val var1 = "var1"
|
|
||||||
val var2 = "var2"
|
|
||||||
template.exchange<List<Foo>>(url, method, entity, var1, var2)
|
|
||||||
verify(exactly = 1) { template.exchange(url, method, entity,
|
|
||||||
object : ParameterizedTypeReference<List<Foo>>() {}, var1, var2) }
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `exchange with reified type parameters, String, HttpMethod, HttpEntity and Map`() {
|
|
||||||
val url = "https://spring.io"
|
|
||||||
val method = HttpMethod.GET
|
|
||||||
val entity = mockk<HttpEntity<Foo>>()
|
|
||||||
val vars = mapOf(Pair("key1", "value1"), Pair("key2", "value2"))
|
|
||||||
template.exchange<List<Foo>>(url, method, entity, vars)
|
|
||||||
verify(exactly = 1) { template.exchange(url, method, entity,
|
|
||||||
object : ParameterizedTypeReference<List<Foo>>() {}, vars) }
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `exchange with reified type parameters, String, HttpMethod, HttpEntity`() {
|
|
||||||
val url = "https://spring.io"
|
|
||||||
val method = HttpMethod.GET
|
|
||||||
val entity = mockk<HttpEntity<Foo>>()
|
|
||||||
template.exchange<List<Foo>>(url, method, entity)
|
|
||||||
verify(exactly = 1) { template.exchange(url, method, entity,
|
|
||||||
object : ParameterizedTypeReference<List<Foo>>() {}) }
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `exchange with reified type parameters and HttpEntity`() {
|
|
||||||
val entity = mockk<RequestEntity<Foo>>()
|
|
||||||
template.exchange<List<Foo>>(entity)
|
|
||||||
verify(exactly = 1) { template.exchange(entity,
|
|
||||||
object : ParameterizedTypeReference<List<Foo>>() {}) }
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `exchange with reified type parameters, String and HttpMethod`() {
|
|
||||||
val url = "https://spring.io"
|
|
||||||
val method = HttpMethod.GET
|
|
||||||
template.exchange<List<Foo>>(url, method)
|
|
||||||
verify(exactly = 1) { template.exchange(url, method, null,
|
|
||||||
object : ParameterizedTypeReference<List<Foo>>() {}) }
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `RestOperations are available`() {
|
|
||||||
val extensions = Class.forName(
|
|
||||||
"org.springframework.boot.web.server.test.client.TestRestTemplateExtensionsKt")
|
|
||||||
ReflectionUtils.doWithMethods(RestOperations::class.java) { method ->
|
|
||||||
arrayOf(ParameterizedTypeReference::class, Class::class).forEach { kClass ->
|
|
||||||
if (method.parameterTypes.contains(kClass.java)) {
|
|
||||||
val parameters = mutableListOf<Class<*>>(TestRestTemplate::class.java)
|
|
||||||
.apply { addAll(method.parameterTypes.filter { it != kClass.java }) }
|
|
||||||
val f = extensions.getDeclaredMethod(method.name,
|
|
||||||
*parameters.toTypedArray()).kotlinFunction!!
|
|
||||||
assertThat(f.typeParameters.size).isEqualTo(1)
|
|
||||||
assertThat(listOf(Any::class.createType()))
|
|
||||||
.isEqualTo(f.typeParameters[0].upperBounds)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Foo
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -0,0 +1,155 @@
|
||||||
|
/*
|
||||||
|
* 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.web.server.context;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
import org.jspecify.annotations.Nullable;
|
||||||
|
|
||||||
|
import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent;
|
||||||
|
import org.springframework.context.ApplicationEvent;
|
||||||
|
import org.springframework.context.event.SmartApplicationListener;
|
||||||
|
import org.springframework.core.Ordered;
|
||||||
|
import org.springframework.core.convert.ConversionFailedException;
|
||||||
|
import org.springframework.core.convert.ConversionService;
|
||||||
|
import org.springframework.core.env.ConfigurableEnvironment;
|
||||||
|
import org.springframework.core.env.MapPropertySource;
|
||||||
|
import org.springframework.core.env.MutablePropertySources;
|
||||||
|
import org.springframework.core.env.PropertyResolver;
|
||||||
|
import org.springframework.core.env.PropertySource;
|
||||||
|
import org.springframework.core.env.PropertySources;
|
||||||
|
import org.springframework.lang.Contract;
|
||||||
|
import org.springframework.test.context.support.TestPropertySourceUtils;
|
||||||
|
import org.springframework.util.ClassUtils;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@link SmartApplicationListener} for tests that starts the management context on a
|
||||||
|
* random port if the main server's port is 0 and the management context is expected on a
|
||||||
|
* different port.
|
||||||
|
*
|
||||||
|
* @author Madhura Bhave
|
||||||
|
* @author Andy Wilkinson
|
||||||
|
* @author Phillip Webb
|
||||||
|
*/
|
||||||
|
class SpringBootTestRandomPortApplicationListener implements SmartApplicationListener, Ordered {
|
||||||
|
|
||||||
|
private static final String TEST_SOURCE_NAME = TestPropertySourceUtils.INLINED_PROPERTIES_PROPERTY_SOURCE_NAME;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getOrder() {
|
||||||
|
return Ordered.LOWEST_PRECEDENCE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {
|
||||||
|
return ApplicationEnvironmentPreparedEvent.class.isAssignableFrom(eventType);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onApplicationEvent(ApplicationEvent event) {
|
||||||
|
if (event instanceof ApplicationEnvironmentPreparedEvent environmentPreparedEvent) {
|
||||||
|
postProcessEnvironment(environmentPreparedEvent.getEnvironment());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void postProcessEnvironment(ConfigurableEnvironment environment) {
|
||||||
|
MapPropertySource testSource = (MapPropertySource) environment.getPropertySources().get(TEST_SOURCE_NAME);
|
||||||
|
if (testSource != null) {
|
||||||
|
MutablePropertySources nonTestSources = new MutablePropertySources(environment.getPropertySources());
|
||||||
|
nonTestSources.remove(TEST_SOURCE_NAME);
|
||||||
|
Ports ports = new Ports(environment, environment.getConversionService());
|
||||||
|
String value = getManagementServerPortPropertyValue(testSource, nonTestSources, ports);
|
||||||
|
if (value != null) {
|
||||||
|
testSource.getSource().put(Port.MANAGEMENT.property(), value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private @Nullable String getManagementServerPortPropertyValue(MapPropertySource testSource,
|
||||||
|
MutablePropertySources nonTestSources, Ports ports) {
|
||||||
|
if (ports.isFixed(testSource, Port.SERVER) || ports.isConfigured(testSource, Port.MANAGEMENT)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
Integer managementPort = ports.get(nonTestSources, Port.MANAGEMENT, null);
|
||||||
|
if (managementPort == null || managementPort.equals(-1) || managementPort.equals(0)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
Integer serverPort = ports.get(nonTestSources, Port.SERVER, 8080);
|
||||||
|
return (!managementPort.equals(serverPort)) ? "0" : "";
|
||||||
|
}
|
||||||
|
|
||||||
|
private enum Port {
|
||||||
|
|
||||||
|
SERVER("server.port"), MANAGEMENT("management.server.port");
|
||||||
|
|
||||||
|
private final String property;
|
||||||
|
|
||||||
|
Port(String property) {
|
||||||
|
this.property = property;
|
||||||
|
}
|
||||||
|
|
||||||
|
String property() {
|
||||||
|
return this.property;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private record Ports(PropertyResolver resolver, ConversionService conversionService) {
|
||||||
|
|
||||||
|
private static final Integer ZERO = Integer.valueOf(0);
|
||||||
|
|
||||||
|
boolean isFixed(MapPropertySource source, Port port) {
|
||||||
|
return !ZERO.equals(get(source, port, null));
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean isConfigured(PropertySource<?> source, Port port) {
|
||||||
|
return source.getProperty(port.property()) != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Contract("_, _, !null -> !null")
|
||||||
|
@Nullable Integer get(PropertySources sources, Port port, @Nullable Integer defaultValue) {
|
||||||
|
return sources.stream()
|
||||||
|
.map((source) -> get(source, port, defaultValue))
|
||||||
|
.filter(Objects::nonNull)
|
||||||
|
.findFirst()
|
||||||
|
.orElse(defaultValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Contract("_, _, !null -> !null")
|
||||||
|
@Nullable Integer get(PropertySource<?> source, Port port, @Nullable Integer defaultValue) {
|
||||||
|
Object value = source.getProperty(port.property());
|
||||||
|
if (value == null || ClassUtils.isAssignableValue(Integer.class, value)) {
|
||||||
|
return (Integer) value;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
return asInteger(value);
|
||||||
|
}
|
||||||
|
catch (ConversionFailedException ex) {
|
||||||
|
if (value instanceof String string) {
|
||||||
|
return asInteger(resolver().resolveRequiredPlaceholders(string));
|
||||||
|
}
|
||||||
|
throw ex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private @Nullable Integer asInteger(@Nullable Object value) {
|
||||||
|
return conversionService().convert(value, Integer.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,62 @@
|
||||||
|
/*
|
||||||
|
* 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.web.server.context;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.jspecify.annotations.Nullable;
|
||||||
|
|
||||||
|
import org.springframework.context.ConfigurableApplicationContext;
|
||||||
|
import org.springframework.test.context.ContextConfigurationAttributes;
|
||||||
|
import org.springframework.test.context.ContextCustomizer;
|
||||||
|
import org.springframework.test.context.ContextCustomizerFactory;
|
||||||
|
import org.springframework.test.context.MergedContextConfiguration;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@link ContextCustomizerFactory} apply
|
||||||
|
* {@link SpringBootTestRandomPortApplicationListener} to tests.
|
||||||
|
*
|
||||||
|
* @author Phillip Webb
|
||||||
|
*/
|
||||||
|
class SpringBootTestRandomPortContextCustomizerFactory implements ContextCustomizerFactory {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @Nullable ContextCustomizer createContextCustomizer(Class<?> testClass,
|
||||||
|
List<ContextConfigurationAttributes> configAttributes) {
|
||||||
|
return new Customizer();
|
||||||
|
}
|
||||||
|
|
||||||
|
static class Customizer implements ContextCustomizer {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void customizeContext(ConfigurableApplicationContext context, MergedContextConfiguration mergedConfig) {
|
||||||
|
context.addApplicationListener(new SpringBootTestRandomPortApplicationListener());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
return (obj != null) && (obj.getClass() == getClass());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return getClass().hashCode();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -16,3 +16,7 @@ org.springframework.boot.web.server.context.MissingWebServerFactoryBeanFailureAn
|
||||||
org.springframework.boot.test.http.server.BaseUrlProvider=\
|
org.springframework.boot.test.http.server.BaseUrlProvider=\
|
||||||
org.springframework.boot.web.server.reactive.context.ReactiveWebServerApplicationContextBaseUrlProvider,\
|
org.springframework.boot.web.server.reactive.context.ReactiveWebServerApplicationContextBaseUrlProvider,\
|
||||||
org.springframework.boot.web.server.servlet.context.ServletWebServerApplicationContextBaseUrlProvider
|
org.springframework.boot.web.server.servlet.context.ServletWebServerApplicationContextBaseUrlProvider
|
||||||
|
|
||||||
|
# Spring Test Context Customizer Factories
|
||||||
|
org.springframework.test.context.ContextCustomizerFactory=\
|
||||||
|
org.springframework.boot.web.server.context.SpringBootTestRandomPortContextCustomizerFactory
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.springframework.boot.web.server.test;
|
package org.springframework.boot.web.server.context;
|
||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
@ -33,14 +33,14 @@ import static org.assertj.core.api.Assertions.assertThat;
|
||||||
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
|
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests for {@link SpringBootTestRandomPortEnvironmentPostProcessor}.
|
* Tests for {@link SpringBootTestRandomPortApplicationListener}.
|
||||||
*
|
*
|
||||||
* @author Madhura Bhave
|
* @author Madhura Bhave
|
||||||
* @author Andy Wilkinson
|
* @author Andy Wilkinson
|
||||||
*/
|
*/
|
||||||
class SpringBootTestRandomPortEnvironmentPostProcessorTests {
|
class SpringBootTestRandomPortApplicationListenerTests {
|
||||||
|
|
||||||
private final SpringBootTestRandomPortEnvironmentPostProcessor postProcessor = new SpringBootTestRandomPortEnvironmentPostProcessor();
|
private final SpringBootTestRandomPortApplicationListener listener = new SpringBootTestRandomPortApplicationListener();
|
||||||
|
|
||||||
private MockEnvironment environment;
|
private MockEnvironment environment;
|
||||||
|
|
||||||
|
@ -55,7 +55,7 @@ class SpringBootTestRandomPortEnvironmentPostProcessorTests {
|
||||||
@Test
|
@Test
|
||||||
void postProcessWhenServerAndManagementPortIsZeroInTestPropertySource() {
|
void postProcessWhenServerAndManagementPortIsZeroInTestPropertySource() {
|
||||||
addTestPropertySource("0", "0");
|
addTestPropertySource("0", "0");
|
||||||
this.postProcessor.postProcessEnvironment(this.environment, null);
|
this.listener.postProcessEnvironment(this.environment);
|
||||||
assertThat(this.environment.getProperty("server.port")).isEqualTo("0");
|
assertThat(this.environment.getProperty("server.port")).isEqualTo("0");
|
||||||
assertThat(this.environment.getProperty("management.server.port")).isEqualTo("0");
|
assertThat(this.environment.getProperty("management.server.port")).isEqualTo("0");
|
||||||
}
|
}
|
||||||
|
@ -66,7 +66,7 @@ class SpringBootTestRandomPortEnvironmentPostProcessorTests {
|
||||||
Map<String, Object> source = new HashMap<>();
|
Map<String, Object> source = new HashMap<>();
|
||||||
source.put("management.server.port", "0");
|
source.put("management.server.port", "0");
|
||||||
this.propertySources.addLast(new MapPropertySource("other", source));
|
this.propertySources.addLast(new MapPropertySource("other", source));
|
||||||
this.postProcessor.postProcessEnvironment(this.environment, null);
|
this.listener.postProcessEnvironment(this.environment);
|
||||||
assertThat(this.environment.getProperty("server.port")).isEqualTo("0");
|
assertThat(this.environment.getProperty("server.port")).isEqualTo("0");
|
||||||
assertThat(this.environment.getProperty("management.server.port")).isEqualTo("0");
|
assertThat(this.environment.getProperty("management.server.port")).isEqualTo("0");
|
||||||
}
|
}
|
||||||
|
@ -76,7 +76,7 @@ class SpringBootTestRandomPortEnvironmentPostProcessorTests {
|
||||||
addTestPropertySource("8080", "8081");
|
addTestPropertySource("8080", "8081");
|
||||||
this.environment.setProperty("server.port", "8080");
|
this.environment.setProperty("server.port", "8080");
|
||||||
this.environment.setProperty("management.server.port", "8081");
|
this.environment.setProperty("management.server.port", "8081");
|
||||||
this.postProcessor.postProcessEnvironment(this.environment, null);
|
this.listener.postProcessEnvironment(this.environment);
|
||||||
assertThat(this.environment.getProperty("server.port")).isEqualTo("8080");
|
assertThat(this.environment.getProperty("server.port")).isEqualTo("8080");
|
||||||
assertThat(this.environment.getProperty("management.server.port")).isEqualTo("8081");
|
assertThat(this.environment.getProperty("management.server.port")).isEqualTo("8081");
|
||||||
}
|
}
|
||||||
|
@ -84,7 +84,7 @@ class SpringBootTestRandomPortEnvironmentPostProcessorTests {
|
||||||
@Test
|
@Test
|
||||||
void postProcessWhenTestServerPortIsZeroAndTestManagementPortIsNotNull() {
|
void postProcessWhenTestServerPortIsZeroAndTestManagementPortIsNotNull() {
|
||||||
addTestPropertySource("0", "8080");
|
addTestPropertySource("0", "8080");
|
||||||
this.postProcessor.postProcessEnvironment(this.environment, null);
|
this.listener.postProcessEnvironment(this.environment);
|
||||||
assertThat(this.environment.getProperty("server.port")).isEqualTo("0");
|
assertThat(this.environment.getProperty("server.port")).isEqualTo("0");
|
||||||
assertThat(this.environment.getProperty("management.server.port")).isEqualTo("8080");
|
assertThat(this.environment.getProperty("management.server.port")).isEqualTo("8080");
|
||||||
}
|
}
|
||||||
|
@ -92,7 +92,7 @@ class SpringBootTestRandomPortEnvironmentPostProcessorTests {
|
||||||
@Test
|
@Test
|
||||||
void postProcessWhenTestServerPortIsZeroAndManagementPortIsNull() {
|
void postProcessWhenTestServerPortIsZeroAndManagementPortIsNull() {
|
||||||
addTestPropertySource("0", null);
|
addTestPropertySource("0", null);
|
||||||
this.postProcessor.postProcessEnvironment(this.environment, null);
|
this.listener.postProcessEnvironment(this.environment);
|
||||||
assertThat(this.environment.getProperty("server.port")).isEqualTo("0");
|
assertThat(this.environment.getProperty("server.port")).isEqualTo("0");
|
||||||
assertThat(this.environment.getProperty("management.server.port")).isNull();
|
assertThat(this.environment.getProperty("management.server.port")).isNull();
|
||||||
}
|
}
|
||||||
|
@ -105,7 +105,7 @@ class SpringBootTestRandomPortEnvironmentPostProcessorTests {
|
||||||
other.put("management.server.port", "8081");
|
other.put("management.server.port", "8081");
|
||||||
MapPropertySource otherSource = new MapPropertySource("other", other);
|
MapPropertySource otherSource = new MapPropertySource("other", other);
|
||||||
this.propertySources.addLast(otherSource);
|
this.propertySources.addLast(otherSource);
|
||||||
this.postProcessor.postProcessEnvironment(this.environment, null);
|
this.listener.postProcessEnvironment(this.environment);
|
||||||
assertThat(this.environment.getProperty("server.port")).isEqualTo("0");
|
assertThat(this.environment.getProperty("server.port")).isEqualTo("0");
|
||||||
assertThat(this.environment.getProperty("management.server.port")).isEmpty();
|
assertThat(this.environment.getProperty("management.server.port")).isEmpty();
|
||||||
}
|
}
|
||||||
|
@ -117,7 +117,7 @@ class SpringBootTestRandomPortEnvironmentPostProcessorTests {
|
||||||
addTestPropertySource("0", null);
|
addTestPropertySource("0", null);
|
||||||
this.propertySources
|
this.propertySources
|
||||||
.addLast(new MapPropertySource("other", Collections.singletonMap("management.server.port", "8080")));
|
.addLast(new MapPropertySource("other", Collections.singletonMap("management.server.port", "8080")));
|
||||||
this.postProcessor.postProcessEnvironment(this.environment, null);
|
this.listener.postProcessEnvironment(this.environment);
|
||||||
assertThat(this.environment.getProperty("server.port")).isEqualTo("0");
|
assertThat(this.environment.getProperty("server.port")).isEqualTo("0");
|
||||||
assertThat(this.environment.getProperty("management.server.port")).isEmpty();
|
assertThat(this.environment.getProperty("management.server.port")).isEmpty();
|
||||||
}
|
}
|
||||||
|
@ -127,7 +127,7 @@ class SpringBootTestRandomPortEnvironmentPostProcessorTests {
|
||||||
addTestPropertySource("0", null);
|
addTestPropertySource("0", null);
|
||||||
this.propertySources
|
this.propertySources
|
||||||
.addLast(new MapPropertySource("other", Collections.singletonMap("management.server.port", "8081")));
|
.addLast(new MapPropertySource("other", Collections.singletonMap("management.server.port", "8081")));
|
||||||
this.postProcessor.postProcessEnvironment(this.environment, null);
|
this.listener.postProcessEnvironment(this.environment);
|
||||||
assertThat(this.environment.getProperty("server.port")).isEqualTo("0");
|
assertThat(this.environment.getProperty("server.port")).isEqualTo("0");
|
||||||
assertThat(this.environment.getProperty("management.server.port")).isEqualTo("0");
|
assertThat(this.environment.getProperty("management.server.port")).isEqualTo("0");
|
||||||
}
|
}
|
||||||
|
@ -137,7 +137,7 @@ class SpringBootTestRandomPortEnvironmentPostProcessorTests {
|
||||||
addTestPropertySource("0", null);
|
addTestPropertySource("0", null);
|
||||||
this.propertySources
|
this.propertySources
|
||||||
.addLast(new MapPropertySource("other", Collections.singletonMap("management.server.port", "-1")));
|
.addLast(new MapPropertySource("other", Collections.singletonMap("management.server.port", "-1")));
|
||||||
this.postProcessor.postProcessEnvironment(this.environment, null);
|
this.listener.postProcessEnvironment(this.environment);
|
||||||
assertThat(this.environment.getProperty("server.port")).isEqualTo("0");
|
assertThat(this.environment.getProperty("server.port")).isEqualTo("0");
|
||||||
assertThat(this.environment.getProperty("management.server.port")).isEqualTo("-1");
|
assertThat(this.environment.getProperty("management.server.port")).isEqualTo("-1");
|
||||||
}
|
}
|
||||||
|
@ -147,7 +147,7 @@ class SpringBootTestRandomPortEnvironmentPostProcessorTests {
|
||||||
addTestPropertySource("0", null);
|
addTestPropertySource("0", null);
|
||||||
this.propertySources
|
this.propertySources
|
||||||
.addLast(new MapPropertySource("other", Collections.singletonMap("management.server.port", 8081)));
|
.addLast(new MapPropertySource("other", Collections.singletonMap("management.server.port", 8081)));
|
||||||
this.postProcessor.postProcessEnvironment(this.environment, null);
|
this.listener.postProcessEnvironment(this.environment);
|
||||||
assertThat(this.environment.getProperty("server.port")).isEqualTo("0");
|
assertThat(this.environment.getProperty("server.port")).isEqualTo("0");
|
||||||
assertThat(this.environment.getProperty("management.server.port")).isEqualTo("0");
|
assertThat(this.environment.getProperty("management.server.port")).isEqualTo("0");
|
||||||
}
|
}
|
||||||
|
@ -160,7 +160,7 @@ class SpringBootTestRandomPortEnvironmentPostProcessorTests {
|
||||||
testPropertySource.getSource().put("port", "9090");
|
testPropertySource.getSource().put("port", "9090");
|
||||||
this.propertySources
|
this.propertySources
|
||||||
.addLast(new MapPropertySource("other", Collections.singletonMap("management.server.port", "${port}")));
|
.addLast(new MapPropertySource("other", Collections.singletonMap("management.server.port", "${port}")));
|
||||||
this.postProcessor.postProcessEnvironment(this.environment, null);
|
this.listener.postProcessEnvironment(this.environment);
|
||||||
assertThat(this.environment.getProperty("server.port")).isEqualTo("0");
|
assertThat(this.environment.getProperty("server.port")).isEqualTo("0");
|
||||||
assertThat(this.environment.getProperty("management.server.port")).isEqualTo("0");
|
assertThat(this.environment.getProperty("management.server.port")).isEqualTo("0");
|
||||||
}
|
}
|
||||||
|
@ -171,7 +171,7 @@ class SpringBootTestRandomPortEnvironmentPostProcessorTests {
|
||||||
this.propertySources
|
this.propertySources
|
||||||
.addLast(new MapPropertySource("other", Collections.singletonMap("management.server.port", "${port}")));
|
.addLast(new MapPropertySource("other", Collections.singletonMap("management.server.port", "${port}")));
|
||||||
assertThatExceptionOfType(PlaceholderResolutionException.class)
|
assertThatExceptionOfType(PlaceholderResolutionException.class)
|
||||||
.isThrownBy(() -> this.postProcessor.postProcessEnvironment(this.environment, null))
|
.isThrownBy(() -> this.listener.postProcessEnvironment(this.environment))
|
||||||
.withMessage("Could not resolve placeholder 'port' in value \"${port}\"");
|
.withMessage("Could not resolve placeholder 'port' in value \"${port}\"");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -185,7 +185,7 @@ class SpringBootTestRandomPortEnvironmentPostProcessorTests {
|
||||||
source.put("server.port", "${port}");
|
source.put("server.port", "${port}");
|
||||||
source.put("management.server.port", "9090");
|
source.put("management.server.port", "9090");
|
||||||
this.propertySources.addLast(new MapPropertySource("other", source));
|
this.propertySources.addLast(new MapPropertySource("other", source));
|
||||||
this.postProcessor.postProcessEnvironment(this.environment, null);
|
this.listener.postProcessEnvironment(this.environment);
|
||||||
assertThat(this.environment.getProperty("server.port")).isEqualTo("0");
|
assertThat(this.environment.getProperty("server.port")).isEqualTo("0");
|
||||||
assertThat(this.environment.getProperty("management.server.port")).isEqualTo("0");
|
assertThat(this.environment.getProperty("management.server.port")).isEqualTo("0");
|
||||||
}
|
}
|
||||||
|
@ -198,7 +198,7 @@ class SpringBootTestRandomPortEnvironmentPostProcessorTests {
|
||||||
source.put("management.server.port", "9090");
|
source.put("management.server.port", "9090");
|
||||||
this.propertySources.addLast(new MapPropertySource("other", source));
|
this.propertySources.addLast(new MapPropertySource("other", source));
|
||||||
assertThatExceptionOfType(PlaceholderResolutionException.class)
|
assertThatExceptionOfType(PlaceholderResolutionException.class)
|
||||||
.isThrownBy(() -> this.postProcessor.postProcessEnvironment(this.environment, null))
|
.isThrownBy(() -> this.listener.postProcessEnvironment(this.environment))
|
||||||
.withMessage("Could not resolve placeholder 'port' in value \"${port}\"");
|
.withMessage("Could not resolve placeholder 'port' in value \"${port}\"");
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,7 +55,6 @@ dependencies {
|
||||||
testImplementation(project(":module:spring-boot-restclient"))
|
testImplementation(project(":module:spring-boot-restclient"))
|
||||||
testImplementation(project(":module:spring-boot-restclient-test"))
|
testImplementation(project(":module:spring-boot-restclient-test"))
|
||||||
testImplementation(project(":module:spring-boot-tomcat"))
|
testImplementation(project(":module:spring-boot-tomcat"))
|
||||||
testImplementation(project(":module:spring-boot-web-server-test"))
|
|
||||||
testImplementation(project(":test-support:spring-boot-test-support"))
|
testImplementation(project(":test-support:spring-boot-test-support"))
|
||||||
testImplementation(testFixtures(project(":module:spring-boot-actuator-autoconfigure")))
|
testImplementation(testFixtures(project(":module:spring-boot-actuator-autoconfigure")))
|
||||||
testImplementation(testFixtures(project(":module:spring-boot-web-server")))
|
testImplementation(testFixtures(project(":module:spring-boot-web-server")))
|
||||||
|
|
|
@ -2179,7 +2179,6 @@ bom {
|
||||||
"spring-boot-tx",
|
"spring-boot-tx",
|
||||||
"spring-boot-validation",
|
"spring-boot-validation",
|
||||||
"spring-boot-web-server",
|
"spring-boot-web-server",
|
||||||
"spring-boot-web-server-test",
|
|
||||||
"spring-boot-webclient",
|
"spring-boot-webclient",
|
||||||
"spring-boot-webflux",
|
"spring-boot-webflux",
|
||||||
"spring-boot-webflux-test",
|
"spring-boot-webflux-test",
|
||||||
|
|
|
@ -186,7 +186,6 @@ include "module:spring-boot-tomcat"
|
||||||
include "module:spring-boot-tx"
|
include "module:spring-boot-tx"
|
||||||
include "module:spring-boot-validation"
|
include "module:spring-boot-validation"
|
||||||
include "module:spring-boot-web-server" // FIXME move to core?
|
include "module:spring-boot-web-server" // FIXME move to core?
|
||||||
include "module:spring-boot-web-server-test" // FIXME move to core?
|
|
||||||
include "module:spring-boot-webclient"
|
include "module:spring-boot-webclient"
|
||||||
include "module:spring-boot-webflux"
|
include "module:spring-boot-webflux"
|
||||||
include "module:spring-boot-webflux-test"
|
include "module:spring-boot-webflux-test"
|
||||||
|
|
|
@ -29,7 +29,6 @@ dependencies {
|
||||||
testImplementation(project(":module:spring-boot-restclient"))
|
testImplementation(project(":module:spring-boot-restclient"))
|
||||||
testImplementation(project(":module:spring-boot-restclient-test"))
|
testImplementation(project(":module:spring-boot-restclient-test"))
|
||||||
testImplementation(project(":core:spring-boot-test"))
|
testImplementation(project(":core:spring-boot-test"))
|
||||||
testImplementation(project(":module:spring-boot-web-server-test"))
|
|
||||||
testImplementation("org.assertj:assertj-core")
|
testImplementation("org.assertj:assertj-core")
|
||||||
testImplementation("org.springframework:spring-test")
|
testImplementation("org.springframework:spring-test")
|
||||||
testImplementation("org.testng:testng:6.8.13")
|
testImplementation("org.testng:testng:6.8.13")
|
||||||
|
|
|
@ -27,7 +27,6 @@ dependencies {
|
||||||
|
|
||||||
api(project(":core:spring-boot-test-autoconfigure"))
|
api(project(":core:spring-boot-test-autoconfigure"))
|
||||||
api(project(":module:spring-boot-restclient-test"))
|
api(project(":module:spring-boot-restclient-test"))
|
||||||
api(project(":module:spring-boot-web-server-test"))
|
|
||||||
|
|
||||||
api("com.jayway.jsonpath:json-path")
|
api("com.jayway.jsonpath:json-path")
|
||||||
api("jakarta.xml.bind:jakarta.xml.bind-api")
|
api("jakarta.xml.bind:jakarta.xml.bind-api")
|
||||||
|
|
Loading…
Reference in New Issue