Affects: spring-test:5.3.23
I wanted to test how the service reacts on unknown HTTP response codes like 222. So I created a service that responds with HTTP status 222 and tried to test it:
@SpringBootTest
class ResponseTest {
@Autowired
org.springframework.test.web.reactive.server.WebTestClient client;
@Test
void test222() {
client.method(HttpMethod.GET).uri("/").exchange().expectStatus().isEqualTo(222);
}
}
The result was an Exception with Stack Trace:
java.lang.IllegalArgumentException: No matching constant for [222]
at org.springframework.http.HttpStatus.valueOf(HttpStatus.java:547)
at org.springframework.http.client.reactive.ReactorClientHttpResponse.getStatusCode(ReactorClientHttpResponse.java:139)
at org.springframework.http.client.reactive.ClientHttpResponseDecorator.getStatusCode(ClientHttpResponseDecorator.java:60)
at org.springframework.test.web.reactive.server.ExchangeResult.getStatus(ExchangeResult.java:176)
at org.springframework.test.web.reactive.server.ExchangeResult.toString(ExchangeResult.java:251)
at java.base/java.lang.String.valueOf(String.java:4218)
at java.base/java.lang.StringBuilder.append(StringBuilder.java:173)
at org.springframework.test.web.reactive.server.ExchangeResult.assertWithDiagnostics(ExchangeResult.java:236)
at org.springframework.test.web.reactive.server.DefaultWebTestClient$DefaultBodySpec.isEqualTo(DefaultWebTestClient.java:554)
at de.gdvdl.tgic.tgicwebauth.routes.WebapiTest.test222(ResponseTest:xyz)
The issue seems to be at org.springframework.test.web.reactive.server.ExchangeResult.toString()
, which assumes that getStatus()
is always available:
"< " + getStatus() + " " + getStatus().getReasonPhrase() + "\n" +
So the line could be something like this:
"< " + getRawStatusCode() + " " + tryToGet(() -> getStatus().getReasonPhrase()) + "\n" +
with
String tryToGet(Supplier<String> func) {
try {
return func.get()
} catch (RuntimeException e) {
return "";
}
}
Comment From: sbrannen
Hi @robert-gdv,
Congratulations on creating your first bug report for the Spring Framework! 👍
And thanks for bringing this to our attention.
This has been fixed in 5.3.x
for inclusion in 5.3.24.