Use new features from JUnit Jupiter 5.11

This commit primarily migrates to the new argumentSet() feature but also
applies additional polishing to our use of parameterized tests.

See gh-33395
This commit is contained in:
Sam Brannen
2024-08-16 13:48:19 +02:00
parent 2eff5cb463
commit d749d2949d
23 changed files with 173 additions and 165 deletions

View File

@@ -46,9 +46,9 @@ import okhttp3.mockwebserver.MockWebServer;
import okhttp3.mockwebserver.RecordedRequest;
import org.eclipse.jetty.client.Request;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Named;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@@ -83,7 +83,7 @@ import org.springframework.web.reactive.function.client.WebClient.ResponseSpec;
import org.springframework.web.testfixture.xml.Pojo;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Named.named;
import static org.junit.jupiter.params.provider.Arguments.argumentSet;
/**
* Integration tests using an {@link ExchangeFunction} through {@link WebClient}.
@@ -99,17 +99,17 @@ class WebClientIntegrationTests {
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@ParameterizedTest(name = "[{index}] {0}")
@ParameterizedTest
@MethodSource("arguments")
@interface ParameterizedWebClientTest {
}
static Stream<Named<ClientHttpConnector>> arguments() {
static Stream<Arguments> arguments() {
return Stream.of(
named("Reactor Netty", new ReactorClientHttpConnector()),
named("JDK", new JdkClientHttpConnector()),
named("Jetty", new JettyClientHttpConnector()),
named("HttpComponents", new HttpComponentsClientHttpConnector())
argumentSet("Reactor Netty", new ReactorClientHttpConnector()),
argumentSet("JDK", new JdkClientHttpConnector()),
argumentSet("Jetty", new JettyClientHttpConnector()),
argumentSet("HttpComponents", new HttpComponentsClientHttpConnector())
);
}

View File

@@ -203,7 +203,7 @@ class ResourceWebHandlerTests {
}
@ParameterizedTest
@MethodSource("httpMethods")
@MethodSource("org.springframework.http.HttpMethod#values()")
void resourceNotFound(HttpMethod method) {
MockServerHttpRequest request = MockServerHttpRequest.method(method, "").build();
MockServerWebExchange exchange = MockServerWebExchange.from(request);
@@ -223,10 +223,6 @@ class ResourceWebHandlerTests {
StepVerifier.create(mono).consumeErrorWith(ex -> assertThat(ex).isNotSameAs(exceptionRef.get())).verify();
}
static Stream<HttpMethod> httpMethods() {
return Arrays.stream(HttpMethod.values());
}
}
@@ -684,7 +680,7 @@ class ResourceWebHandlerTests {
}
@ParameterizedTest
@MethodSource("httpMethods")
@MethodSource("org.springframework.http.HttpMethod#values()")
void resolvePathWithTraversal(HttpMethod method) throws Exception {
Resource location = new ClassPathResource("test/", getClass());
this.handler.setLocations(List.of(location));

View File

@@ -18,9 +18,9 @@ package org.springframework.web.reactive.result.method.annotation;
import java.util.stream.Stream;
import org.junit.jupiter.api.Named;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
@@ -34,7 +34,6 @@ import org.springframework.web.client.RestTemplate;
import org.springframework.web.reactive.config.EnableWebFlux;
import org.springframework.web.server.adapter.WebHttpHandlerBuilder;
import org.springframework.web.testfixture.http.server.reactive.bootstrap.AbstractHttpServer;
import org.springframework.web.testfixture.http.server.reactive.bootstrap.HttpServer;
import org.springframework.web.testfixture.http.server.reactive.bootstrap.JettyCoreHttpServer;
import org.springframework.web.testfixture.http.server.reactive.bootstrap.JettyHttpServer;
import org.springframework.web.testfixture.http.server.reactive.bootstrap.ReactorHttpServer;
@@ -42,7 +41,7 @@ import org.springframework.web.testfixture.http.server.reactive.bootstrap.Tomcat
import org.springframework.web.testfixture.http.server.reactive.bootstrap.UndertowHttpServer;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Named.named;
import static org.junit.jupiter.params.provider.Arguments.argumentSet;
/**
* Integration tests related to the use of context paths.
@@ -51,17 +50,17 @@ import static org.junit.jupiter.api.Named.named;
*/
class ContextPathIntegrationTests {
static Stream<Named<HttpServer>> httpServers() {
static Stream<Arguments> httpServers() {
return Stream.of(
named("Jetty", new JettyHttpServer()),
named("Jetty Core", new JettyCoreHttpServer()),
named("Reactor Netty", new ReactorHttpServer()),
named("Tomcat", new TomcatHttpServer()),
named("Undertow", new UndertowHttpServer())
argumentSet("Jetty", new JettyHttpServer()),
argumentSet("Jetty Core", new JettyCoreHttpServer()),
argumentSet("Reactor Netty", new ReactorHttpServer()),
argumentSet("Tomcat", new TomcatHttpServer()),
argumentSet("Undertow", new UndertowHttpServer())
);
}
@ParameterizedTest(name = "[{index}] {0}")
@ParameterizedTest
@MethodSource("httpServers")
void multipleWebFluxApps(AbstractHttpServer server) throws Exception {
AnnotationConfigApplicationContext context1 = new AnnotationConfigApplicationContext(WebAppConfig.class);

View File

@@ -24,11 +24,13 @@ import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.net.URI;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Stream;
import org.apache.tomcat.websocket.server.WsContextListener;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Named;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;
import org.xnio.OptionMap;
@@ -69,6 +71,8 @@ import org.springframework.web.testfixture.http.server.reactive.bootstrap.Reacto
import org.springframework.web.testfixture.http.server.reactive.bootstrap.TomcatHttpServer;
import org.springframework.web.testfixture.http.server.reactive.bootstrap.UndertowHttpServer;
import static org.junit.jupiter.api.Named.named;
/**
* Base class for reactive WebSocket integration tests. Subclasses must implement
* {@link #getWebConfigClass()} to return Spring config class with (server-side)
@@ -84,34 +88,35 @@ abstract class AbstractReactiveWebSocketIntegrationTests {
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@ParameterizedTest(name = "[{index}] client[{0}], server[{1}]")
@ParameterizedTest(name = "[{index}] client = {0} , server = {1}")
@MethodSource("arguments")
@interface ParameterizedWebSocketTest {
}
static Stream<Object[]> arguments() throws IOException {
WebSocketClient[] clients = new WebSocketClient[] {
new TomcatWebSocketClient(),
new JettyWebSocketClient(),
new ReactorNettyWebSocketClient(),
new UndertowWebSocketClient(Xnio.getInstance().createWorker(OptionMap.EMPTY))
};
List<Named<WebSocketClient>> clients = List.of(
named(TomcatWebSocketClient.class.getSimpleName(), new TomcatWebSocketClient()),
named(JettyWebSocketClient.class.getSimpleName(), new JettyWebSocketClient()),
named(ReactorNettyWebSocketClient.class.getSimpleName(), new ReactorNettyWebSocketClient()),
named(UndertowWebSocketClient.class.getSimpleName(), new UndertowWebSocketClient(Xnio.getInstance().createWorker(OptionMap.EMPTY)))
);
Map<HttpServer, Class<?>> servers = new LinkedHashMap<>();
servers.put(new TomcatHttpServer(TMP_DIR.getAbsolutePath(), WsContextListener.class), TomcatConfig.class);
servers.put(new JettyHttpServer(), JettyConfig.class);
servers.put(new JettyCoreHttpServer(), JettyCoreConfig.class);
servers.put(new ReactorHttpServer(), ReactorNettyConfig.class);
servers.put(new UndertowHttpServer(), UndertowConfig.class);
Map<Named<HttpServer>, Class<?>> servers = new LinkedHashMap<>();
servers.put(named(TomcatHttpServer.class.getSimpleName(), new TomcatHttpServer(TMP_DIR.getAbsolutePath(), WsContextListener.class)),
TomcatConfig.class);
servers.put(named(JettyHttpServer.class.getSimpleName(), new JettyHttpServer()), JettyConfig.class);
servers.put(named(JettyCoreHttpServer.class.getSimpleName(), new JettyCoreHttpServer()), JettyCoreConfig.class);
servers.put(named(ReactorHttpServer.class.getSimpleName(), new ReactorHttpServer()), ReactorNettyConfig.class);
servers.put(named(UndertowHttpServer.class.getSimpleName(), new UndertowHttpServer()), UndertowConfig.class);
// Try each client once against each server
Flux<WebSocketClient> f1 = Flux.fromArray(clients)
Flux<Named<WebSocketClient>> f1 = Flux.fromIterable(clients)
.concatMap(c -> Mono.just(c).repeat(servers.size() - 1));
Flux<Map.Entry<HttpServer, Class<?>>> f2 = Flux.fromIterable(servers.entrySet())
.repeat(clients.length - 1)
Flux<Map.Entry<Named<HttpServer>, Class<?>>> f2 = Flux.fromIterable(servers.entrySet())
.repeat(clients.size() - 1)
.share();
return Flux.zip(f1, f2.map(Map.Entry::getKey), f2.map(Map.Entry::getValue))