Skip to content

Commit fce2556

Browse files
committed
Polish "Improve diagnostics for null configuration"
See gh-583
1 parent b5f2454 commit fce2556

File tree

8 files changed

+39
-53
lines changed

8 files changed

+39
-53
lines changed

spring-restdocs-mockmvc/src/main/java/org/springframework/restdocs/mockmvc/RestDocumentationResultHandler.java

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public class RestDocumentationResultHandler implements ResultHandler {
4949

5050
@Override
5151
public void handle(MvcResult result) throws Exception {
52-
this.delegate.handle(result.getRequest(), result.getResponse(), getRequiredConfiguration(result));
52+
this.delegate.handle(result.getRequest(), result.getResponse(), retrieveConfiguration(result));
5353
}
5454

5555
/**
@@ -72,7 +72,7 @@ public RestDocumentationResultHandler document(Snippet... snippets) {
7272

7373
@Override
7474
public void handle(MvcResult result) throws Exception {
75-
Map<String, Object> configuration = new HashMap<>(getRequiredConfiguration(result));
75+
Map<String, Object> configuration = new HashMap<>(retrieveConfiguration(result));
7676
configuration.remove(RestDocumentationGenerator.ATTRIBUTE_NAME_DEFAULT_SNIPPETS);
7777
getDelegate().handle(result.getRequest(), result.getResponse(), configuration);
7878
}
@@ -88,15 +88,12 @@ protected final RestDocumentationGenerator<MockHttpServletRequest, MockHttpServl
8888
return this.delegate;
8989
}
9090

91-
private static Map<String, Object> getRequiredConfiguration(MvcResult result) {
91+
private Map<String, Object> retrieveConfiguration(MvcResult result) {
9292
@SuppressWarnings("unchecked")
9393
Map<String, Object> configuration = (Map<String, Object>) result.getRequest()
9494
.getAttribute(ATTRIBUTE_NAME_CONFIGURATION);
95-
Assert.state(configuration != null,
96-
() -> String.format(
97-
"There is no REST Docs configuration. Looks like "
98-
+ "'%s' was not invoked. Please check your configuration.",
99-
MockMvcRestDocumentationConfigurer.class.getName()));
95+
Assert.state(configuration != null, () -> "REST Docs configuration not found. Did you forget to apply a "
96+
+ MockMvcRestDocumentationConfigurer.class.getSimpleName() + " when building the MockMvc instance?");
10097
return configuration;
10198
}
10299

spring-restdocs-mockmvc/src/test/java/org/springframework/restdocs/mockmvc/MockMvcRestDocumentationIntegrationTests.java

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -496,7 +496,8 @@ public void customContextPath() throws Exception {
496496
public void exceptionShouldBeThrownWhenCallDocumentMockMvcNotConfigured() {
497497
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(this.context).build();
498498
assertThatThrownBy(() -> mockMvc.perform(get("/").accept(MediaType.APPLICATION_JSON)).andDo(document("basic")))
499-
.isInstanceOf(IllegalStateException.class).hasMessageContaining(missingConfigurationMessage());
499+
.isInstanceOf(IllegalStateException.class).hasMessage("REST Docs configuration not found. Did you "
500+
+ "forget to apply a MockMvcRestDocumentationConfigurer when building the MockMvc instance?");
500501

501502
}
502503

@@ -506,13 +507,9 @@ public void exceptionShouldBeThrownWhenCallDocumentSnippetsMockMvcNotConfigured(
506507
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(this.context).build();
507508
assertThatThrownBy(() -> mockMvc.perform(get("/").accept(MediaType.APPLICATION_JSON))
508509
.andDo(documentation.document(responseHeaders(headerWithName("a").description("one")))))
509-
.isInstanceOf(IllegalStateException.class).hasMessageContaining(missingConfigurationMessage());
510-
}
511-
512-
private String missingConfigurationMessage() {
513-
return "There is no REST Docs configuration. Looks like "
514-
+ "'org.springframework.restdocs.mockmvc.MockMvcRestDocumentationConfigurer' "
515-
+ "was not invoked. Please check your configuration.";
510+
.isInstanceOf(IllegalStateException.class)
511+
.hasMessage("REST Docs configuration not found. Did you forget to apply a "
512+
+ "MockMvcRestDocumentationConfigurer when building the MockMvc instance?");
516513
}
517514

518515
@Test

spring-restdocs-restassured/src/main/java/org/springframework/restdocs/restassured3/RestDocumentationFilter.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public final Response filter(FilterableRequestSpecification requestSpec,
6767
* @return the configuration
6868
*/
6969
protected Map<String, Object> getConfiguration(FilterableRequestSpecification requestSpec, FilterContext context) {
70-
Map<String, Object> configuration = new HashMap<>(getRequiredConfiguration(context));
70+
Map<String, Object> configuration = new HashMap<>(retrieveConfiguration(context));
7171
configuration.put(RestDocumentationContext.class.getName(),
7272
context.<RestDocumentationContext>getValue(RestDocumentationContext.class.getName()));
7373
configuration.put(RestDocumentationGenerator.ATTRIBUTE_NAME_URL_TEMPLATE, requestSpec.getUserDefinedPath());
@@ -96,13 +96,12 @@ protected Map<String, Object> getConfiguration(FilterableRequestSpecification re
9696
};
9797
}
9898

99-
private static Map<String, Object> getRequiredConfiguration(FilterContext context) {
99+
private static Map<String, Object> retrieveConfiguration(FilterContext context) {
100100
Map<String, Object> configuration = context.getValue(CONTEXT_KEY_CONFIGURATION);
101101
Assert.state(configuration != null,
102-
() -> String.format(
103-
"There is no REST Docs configuration. Looks like "
104-
+ "'%s' was not invoked. Please check your configuration.",
105-
RestDocumentationFilter.class.getName()));
102+
() -> "REST Docs configuration not found. Did you forget to add a "
103+
+ RestAssuredRestDocumentationConfigurer.class.getSimpleName()
104+
+ " as a filter when building the RequestSpecification?");
106105
return configuration;
107106
}
108107

spring-restdocs-restassured/src/test/java/org/springframework/restdocs/restassured3/RestAssuredRestDocumentationIntegrationTests.java

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -343,22 +343,20 @@ public void customSnippetTemplate() throws Exception {
343343
@Test
344344
public void exceptionShouldBeThrownWhenCallDocumentRequestSpecificationNotConfigured() {
345345
assertThatThrownBy(() -> given().port(tomcat.getPort()).filter(document("default")).get("/"))
346-
.isInstanceOf(IllegalStateException.class).hasMessageContaining(messingConfigurationMessage());
346+
.isInstanceOf(IllegalStateException.class)
347+
.hasMessage("REST Docs configuration not found. Did you forget to add a "
348+
+ "RestAssuredRestDocumentationConfigurer as a filter when building the RequestSpecification?");
347349
}
348350

349351
@Test
350352
public void exceptionShouldBeThrownWhenCallDocumentSnippetsRequestSpecificationNotConfigured() {
351353
RestDocumentationFilter documentation = document("{method-name}-{step}");
352354
assertThatThrownBy(() -> given().port(tomcat.getPort())
353355
.filter(documentation.document(responseHeaders(headerWithName("a").description("one")))).get("/"))
354-
.isInstanceOf(IllegalStateException.class).hasMessageContaining(messingConfigurationMessage());
355-
}
356-
357-
private String messingConfigurationMessage() {
358-
return "There is no REST Docs configuration. Looks like 'org.springframework."
359-
+ "restdocs.restassured3.RestDocumentationFilter' was not invoked."
360-
+ " Please check your configuration.";
361-
356+
.isInstanceOf(IllegalStateException.class)
357+
.hasMessage("REST Docs configuration not found. Did you forget to add a "
358+
+ "RestAssuredRestDocumentationConfigurer as a filter when building the "
359+
+ "RequestSpecification?");
362360
}
363361

364362
private void assertExpectedSnippetFilesExist(File directory, String... snippets) {

spring-restdocs-webtestclient/src/main/java/org/springframework/restdocs/webtestclient/WebTestClientRestDocumentation.java

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

1717
package org.springframework.restdocs.webtestclient;
1818

19-
import java.util.HashMap;
2019
import java.util.Map;
2120
import java.util.function.Consumer;
2221

@@ -30,7 +29,6 @@
3029
import org.springframework.test.web.reactive.server.WebTestClient.BodyContentSpec;
3130
import org.springframework.test.web.reactive.server.WebTestClient.BodySpec;
3231
import org.springframework.test.web.reactive.server.WebTestClient.Builder;
33-
import org.springframework.util.Assert;
3432
import org.springframework.web.reactive.function.client.ExchangeFilterFunction;
3533

3634
/**
@@ -76,7 +74,7 @@ public static WebTestClientRestDocumentationConfigurer documentationConfiguratio
7674
*/
7775
public static <T extends ExchangeResult> Consumer<T> document(String identifier, Snippet... snippets) {
7876
return (result) -> new RestDocumentationGenerator<>(identifier, REQUEST_CONVERTER, RESPONSE_CONVERTER, snippets)
79-
.handle(result, result, getRequiredConfiguration(result));
77+
.handle(result, result, retrieveConfiguration(result));
8078
}
8179

8280
/**
@@ -93,7 +91,7 @@ public static <T extends ExchangeResult> Consumer<T> document(String identifier,
9391
public static <T extends ExchangeResult> Consumer<T> document(String identifier,
9492
OperationRequestPreprocessor requestPreprocessor, Snippet... snippets) {
9593
return (result) -> new RestDocumentationGenerator<>(identifier, REQUEST_CONVERTER, RESPONSE_CONVERTER,
96-
requestPreprocessor, snippets).handle(result, result, getRequiredConfiguration(result));
94+
requestPreprocessor, snippets).handle(result, result, retrieveConfiguration(result));
9795
}
9896

9997
/**
@@ -110,7 +108,7 @@ public static <T extends ExchangeResult> Consumer<T> document(String identifier,
110108
public static <T extends ExchangeResult> Consumer<T> document(String identifier,
111109
OperationResponsePreprocessor responsePreprocessor, Snippet... snippets) {
112110
return (result) -> new RestDocumentationGenerator<>(identifier, REQUEST_CONVERTER, RESPONSE_CONVERTER,
113-
responsePreprocessor, snippets).handle(result, result, getRequiredConfiguration(result));
111+
responsePreprocessor, snippets).handle(result, result, retrieveConfiguration(result));
114112
}
115113

116114
/**
@@ -131,17 +129,12 @@ public static <T extends ExchangeResult> Consumer<T> document(String identifier,
131129
Snippet... snippets) {
132130
return (result) -> new RestDocumentationGenerator<>(identifier, REQUEST_CONVERTER, RESPONSE_CONVERTER,
133131
requestPreprocessor, responsePreprocessor, snippets).handle(result, result,
134-
getRequiredConfiguration(result));
132+
retrieveConfiguration(result));
135133
}
136134

137-
private static Map<String, Object> getRequiredConfiguration(ExchangeResult result) {
138-
Map<String, Object> config = WebTestClientRestDocumentationConfigurer
135+
private static Map<String, Object> retrieveConfiguration(ExchangeResult result) {
136+
Map<String, Object> configuration = WebTestClientRestDocumentationConfigurer
139137
.retrieveConfiguration(result.getRequestHeaders());
140-
Assert.state(config != null,
141-
() -> String.format("There is no REST Docs configuration. Looks like '%s' "
142-
+ "was not invoked or configuration has already been removed. Please check your configuration.",
143-
WebTestClientRestDocumentationConfigurer.class.getName()));
144-
Map<String, Object> configuration = new HashMap<>(config);
145138
configuration.put(RestDocumentationGenerator.ATTRIBUTE_NAME_URL_TEMPLATE, result.getUriTemplate());
146139
return configuration;
147140
}

spring-restdocs-webtestclient/src/main/java/org/springframework/restdocs/webtestclient/WebTestClientRestDocumentationConfigurer.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.springframework.restdocs.RestDocumentationContextProvider;
3030
import org.springframework.restdocs.config.RestDocumentationConfigurer;
3131
import org.springframework.test.web.reactive.server.WebTestClient;
32+
import org.springframework.util.Assert;
3233
import org.springframework.util.StringUtils;
3334
import org.springframework.web.reactive.function.client.ClientRequest;
3435
import org.springframework.web.reactive.function.client.ClientResponse;
@@ -78,7 +79,10 @@ private Map<String, Object> createConfiguration() {
7879

7980
static Map<String, Object> retrieveConfiguration(HttpHeaders headers) {
8081
String requestId = headers.getFirst(WebTestClient.WEBTESTCLIENT_REQUEST_ID);
81-
return configurations.remove(requestId);
82+
Map<String, Object> configuration = configurations.remove(requestId);
83+
Assert.state(configuration != null, () -> "REST Docs configuration not found. Did you forget to register a "
84+
+ WebTestClientRestDocumentationConfigurer.class.getSimpleName() + " as a filter?");
85+
return configuration;
8286
}
8387

8488
@Override

spring-restdocs-webtestclient/src/test/java/org/springframework/restdocs/webtestclient/WebTestClientRestDocumentationConfigurerTests.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.springframework.web.reactive.function.client.ExchangeFunction;
3030

3131
import static org.assertj.core.api.Assertions.assertThat;
32+
import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
3233
import static org.mockito.Mockito.mock;
3334
import static org.mockito.Mockito.verify;
3435

@@ -51,7 +52,8 @@ public void configurationCanBeRetrievedButOnlyOnce() {
5152
.header(WebTestClient.WEBTESTCLIENT_REQUEST_ID, "1").build();
5253
this.configurer.filter(request, mock(ExchangeFunction.class));
5354
assertThat(WebTestClientRestDocumentationConfigurer.retrieveConfiguration(request.headers())).isNotNull();
54-
assertThat(WebTestClientRestDocumentationConfigurer.retrieveConfiguration(request.headers())).isNull();
55+
assertThatIllegalStateException()
56+
.isThrownBy(() -> WebTestClientRestDocumentationConfigurer.retrieveConfiguration(request.headers()));
5557
}
5658

5759
@Test

spring-restdocs-webtestclient/src/test/java/org/springframework/restdocs/webtestclient/WebTestClientRestDocumentationIntegrationTests.java

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -180,13 +180,9 @@ public void illegalStateExceptionShouldBeThrownWhenCallDocumentWebClientNotConfi
180180
assertThatThrownBy(() -> this.webTestClient
181181
.mutateWith((builder, httpHandlerBuilder, connector) -> builder.filters(List::clear).build()).get()
182182
.uri("/").exchange().expectBody().consumeWith(document("default-snippets")))
183-
.isInstanceOf(IllegalStateException.class).hasMessageContaining(missingConfiguration());
184-
}
185-
186-
private String missingConfiguration() {
187-
return "There is no REST Docs configuration. Looks like "
188-
+ "'org.springframework.restdocs.webtestclient.WebTestClientRestDocumentationConfigurer' "
189-
+ "was not invoked or configuration has already been removed. Please check your configuration.";
183+
.isInstanceOf(IllegalStateException.class)
184+
.hasMessage("REST Docs configuration not found. Did you forget to register a "
185+
+ "WebTestClientRestDocumentationConfigurer as a filter?");
190186
}
191187

192188
private void assertExpectedSnippetFilesExist(File directory, String... snippets) {

0 commit comments

Comments
 (0)