From 43ec46fcc15b704d297bcdf3cf32760ea84213c8 Mon Sep 17 00:00:00 2001 From: Jochen Just Date: Fri, 9 Aug 2019 12:38:12 +0200 Subject: [PATCH 1/2] Allow custom snippets directory via JUnit 5 See gh-633 --- docs/src/docs/asciidoc/getting-started.adoc | 12 ++++++++++++ .../restdocs/RestDocumentationExtension.java | 19 ++++++++++++++++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/docs/src/docs/asciidoc/getting-started.adoc b/docs/src/docs/asciidoc/getting-started.adoc index 91e25f07..9c534871 100644 --- a/docs/src/docs/asciidoc/getting-started.adoc +++ b/docs/src/docs/asciidoc/getting-started.adoc @@ -397,6 +397,18 @@ based on your project's build tool: |=== +If you are using JUnit 5.1 or later the default can be overridden by providing +an output directory when registering the `RestDocumentationExtension` instance: + +[source,java,indent=0] +---- +public class JUnit5ExampleTests { + @RegisterExtension + static final RestDocumentationExtension restDocumentation = + new RestDocumentationExtension ("custom"); +} +---- + Next, you must provide a `@BeforeEach` method to configure MockMvc, WebTestClient, or diff --git a/spring-restdocs-core/src/main/java/org/springframework/restdocs/RestDocumentationExtension.java b/spring-restdocs-core/src/main/java/org/springframework/restdocs/RestDocumentationExtension.java index 7c9292db..7b9cf57a 100644 --- a/spring-restdocs-core/src/main/java/org/springframework/restdocs/RestDocumentationExtension.java +++ b/spring-restdocs-core/src/main/java/org/springframework/restdocs/RestDocumentationExtension.java @@ -32,6 +32,16 @@ import org.junit.jupiter.api.extension.ParameterResolver; */ public class RestDocumentationExtension implements BeforeEachCallback, AfterEachCallback, ParameterResolver { + private final String outputDirectory; + + public RestDocumentationExtension () { + this(null); + } + + public RestDocumentationExtension (String outputDirectory) { + this.outputDirectory = outputDirectory; + } + @Override public void beforeEach(ExtensionContext context) throws Exception { this.getDelegate(context).beforeTest(context.getRequiredTestClass(), context.getRequiredTestMethod().getName()); @@ -62,7 +72,14 @@ public class RestDocumentationExtension implements BeforeEachCallback, AfterEach private ManualRestDocumentation getDelegate(ExtensionContext context) { Namespace namespace = Namespace.create(getClass(), context.getUniqueId()); return context.getStore(namespace).getOrComputeIfAbsent(ManualRestDocumentation.class, - (key) -> new ManualRestDocumentation(), ManualRestDocumentation.class); + this::createManualRestDocumentation, ManualRestDocumentation.class); } + private ManualRestDocumentation createManualRestDocumentation (Class key) { + if (outputDirectory != null) { + return new ManualRestDocumentation(outputDirectory); + } else { + return new ManualRestDocumentation(); + } + } } From bc66fe56430ed9ee84f0ca23f754810e01502a5e Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Fri, 30 Aug 2019 11:37:22 +0100 Subject: [PATCH 2/2] Polish "Allow custom snippets directory via JUnit 5" See gh-633 --- docs/src/docs/asciidoc/getting-started.adoc | 14 +++++------ .../restdocs/RestDocumentationExtension.java | 24 ++++++++++++++----- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/docs/src/docs/asciidoc/getting-started.adoc b/docs/src/docs/asciidoc/getting-started.adoc index 9c534871..8ce277be 100644 --- a/docs/src/docs/asciidoc/getting-started.adoc +++ b/docs/src/docs/asciidoc/getting-started.adoc @@ -397,20 +397,20 @@ based on your project's build tool: |=== -If you are using JUnit 5.1 or later the default can be overridden by providing -an output directory when registering the `RestDocumentationExtension` instance: +If you are using JUnit 5.1, you can override the default by registering the extension +as a field in your test class and providing an output directory when creating it. The +following example shows how to do so: [source,java,indent=0] ---- public class JUnit5ExampleTests { - @RegisterExtension - static final RestDocumentationExtension restDocumentation = - new RestDocumentationExtension ("custom"); + + @RegisterExtension + final RestDocumentationExtension restDocumentation = new RestDocumentationExtension ("custom"); + } ---- - - Next, you must provide a `@BeforeEach` method to configure MockMvc, WebTestClient, or REST Assured. The following listings show how to do so: diff --git a/spring-restdocs-core/src/main/java/org/springframework/restdocs/RestDocumentationExtension.java b/spring-restdocs-core/src/main/java/org/springframework/restdocs/RestDocumentationExtension.java index 7b9cf57a..743ad319 100644 --- a/spring-restdocs-core/src/main/java/org/springframework/restdocs/RestDocumentationExtension.java +++ b/spring-restdocs-core/src/main/java/org/springframework/restdocs/RestDocumentationExtension.java @@ -34,11 +34,21 @@ public class RestDocumentationExtension implements BeforeEachCallback, AfterEach private final String outputDirectory; - public RestDocumentationExtension () { + /** + * Creates a new {@code RestDocumentationExtension} that will use the default output + * directory. + */ + public RestDocumentationExtension() { this(null); } - public RestDocumentationExtension (String outputDirectory) { + /** + * Creates a new {@code RestDocumentationExtension} that will use the given + * {@code outputDirectory}. + * @param outputDirectory snippet output directory + * @since 2.0.4 + */ + public RestDocumentationExtension(String outputDirectory) { this.outputDirectory = outputDirectory; } @@ -75,11 +85,13 @@ public class RestDocumentationExtension implements BeforeEachCallback, AfterEach this::createManualRestDocumentation, ManualRestDocumentation.class); } - private ManualRestDocumentation createManualRestDocumentation (Class key) { - if (outputDirectory != null) { - return new ManualRestDocumentation(outputDirectory); - } else { + private ManualRestDocumentation createManualRestDocumentation(Class key) { + if (this.outputDirectory != null) { + return new ManualRestDocumentation(this.outputDirectory); + } + else { return new ManualRestDocumentation(); } } + }