SpringBoot中文參考指南46.3.21自動配置的Spring REST Docs測試

下一篇[未完待續]

SpringBoot中文參考指南46.3.21自動配置的Spring REST Docs測試

<code>英文原文:https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-testing.html/<code>
<code>GitHub:https://github.com/jijicai/Spring/tree/master/spring-boot/<code>

46.3.21、自動配置的 Spring REST Docs 測試

你可以使用 @AutoConfigureRestDocs 註解來在帶有 Mock MVC、REST Assured 或 WebTestClient 的測試中使用 Spring REST Docs。它消除了 Spring REST Docs 中對 JUnit 規則的需要。(https://projects.spring.io/spring-restdocs/ )

@AutoConfigureRestDocs 可用於覆蓋默認輸出目錄 (如果使用 Maven,則為 target/generated-snippets,如果使用 Gradle,則為 build/generated-snippets)。它還可用於配置出現在任何記錄的 URIs 中的主機、模式(scheme)和端口。

用 Mock MVC 的自動配置的 Spring REST Docs 測試

@AutoConfigureRestDocs 自定義 MockMvc bean 以使用 Spring REST Docs。你可以使用 @Autowired 注入它,並在測試中使用它,就像使用 Mock MVC 和 Spring REST Docs 時一樣,如下面示例所示:

SpringBoot中文參考指南46.3.21自動配置的Spring REST Docs測試

<code>import org.junit.Test;
import org.junit.runner.RunWith;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;

import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;

@RunWith(SpringRunner.class)
@WebMvcTest(UserController.class)
@AutoConfigureRestDocs
public class UserDocumentationTests {

@Autowired
private MockMvc mvc;

@Test
public void listUsers() throws Exception {
this.mvc.perform(get("/users").accept(MediaType.TEXT_PLAIN))
.andExpect(status().isOk())
.andDo(document("list-users"));
}

}/<code>

如果你需要對 Spring REST Docs 配置的更多控制,而不是由 @AutoConfigureRestDocs 的屬性提供,則你可以使用 RestDocsMockMvcConfigurationCustomizer bean,如下面示例所示:

SpringBoot中文參考指南46.3.21自動配置的Spring REST Docs測試

<code>@TestConfiguration
static class CustomizationConfiguration
implements RestDocsMockMvcConfigurationCustomizer {

@Override
public void customize(MockMvcRestDocumentationConfigurer configurer) {
configurer.snippets().withTemplateFormat(TemplateFormats.markdown());
}

}/<code>

如果你想利用 Spring REST Docs 對參數化輸出目錄的支持,可以創建 RestDocumentationResultHandler bean。自動配置使用此結果處理器調用 alwaysDo,從而使每個 MockMvc 調用自動生成默認代碼片段。下面的示例展示了定義的RestDocumentationResultHandler:

SpringBoot中文參考指南46.3.21自動配置的Spring REST Docs測試

<code>@TestConfiguration
static class ResultHandlerConfiguration {

@Bean
public RestDocumentationResultHandler restDocumentation() {
return MockMvcRestDocumentation.document("{method-name}");
}

}/<code>

用 WebTestClient 的自動配置的 Spring REST Docs 測試

@AutoConfigureRestDocs 也可以與 WebTestClient 一起使用。你可以使用 @Autowired 注入它,並在測試中使用它,就像使用 @WebFluxTest 和 Spring REST Docs 時一樣,如下面示例所示:

SpringBoot中文參考指南46.3.21自動配置的Spring REST Docs測試

<code>import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs;
import org.springframework.boot.test.autoconfigure.web.reactive.WebFluxTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.reactive.server.WebTestClient;

import static org.springframework.restdocs.webtestclient.WebTestClientRestDocumentation.document;

@RunWith(SpringRunner.class)
@WebFluxTest
@AutoConfigureRestDocs
public class UsersDocumentationTests {

@Autowired
private WebTestClient webTestClient;

@Test
void listUsers() {
this.webTestClient.get().uri("/").exchange().expectStatus().isOk().expectBody()
.consumeWith(document("list-users"));
}

}
/<code>

如果你需要對 Spring REST Docs 配置的更多控制,而不是由 @AutoConfigureRestDocs 的屬性提供,則你可以使用 RestDocsWebTestClientConfigurationCustomizer bean,如下面示例所示:

SpringBoot中文參考指南46.3.21自動配置的Spring REST Docs測試

<code>@TestConfiguration
public static class CustomizationConfiguration implements RestDocsWebTestClientConfigurationCustomizer {

@Override
public void customize(WebTestClientRestDocumentationConfigurer configurer) {
configurer.snippets().withEncoding("UTF-8");
}

}/<code>

用 REST Assured 的自動配置的 Spring REST Docs 測試

@AutoConfigureRestDocs 使預先配置為使用 Spring REST Docs 的 RequestSpecification bean 可用於你的測試。你可以使用 @Autowired 注入它,並在測試中使用它,就像使用 REST Assured 和 Spring REST Docs 時一樣,如下面示例所示:

SpringBoot中文參考指南46.3.21自動配置的Spring REST Docs測試

<code>import io.restassured.specification.RequestSpecification;
import org.junit.Test;
import org.junit.runner.RunWith;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.boot.web.server.LocalServerPort;
import org.springframework.test.context.junit4.SpringRunner;

import static io.restassured.RestAssured.given;
import static org.hamcrest.CoreMatchers.is;
import static org.springframework.restdocs.restassured3.RestAssuredRestDocumentation.document;

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@AutoConfigureRestDocs
public class UserDocumentationTests {

@LocalServerPort
private int port;

@Autowired
private RequestSpecification documentationSpec;

@Test
public void listUsers() {
given(this.documentationSpec).filter(document("list-users")).when().port(this.port).get("/").then().assertThat()
.statusCode(is(200));
}

}/<code>

如果你需要對 Spring REST Docs 配置的更多控制,而不是由 @AutoConfigureRestDocs 的屬性提供,則你可以使用 RestDocsRestAssuredConfigurationCustomizer bean,如下面示例所示:

SpringBoot中文參考指南46.3.21自動配置的Spring REST Docs測試

<code>@TestConfiguration
public static class CustomizationConfiguration implements RestDocsRestAssuredConfigurationCustomizer {

@Override
public void customize(RestAssuredRestDocumentationConfigurer configurer) {
configurer.snippets().withTemplateFormat(TemplateFormats.markdown());
}

}/<code>

46.3.22、附加的自動配置和切片

每個切片提供一個或多個 @AutoConfigure… 註解,即定義應該作為切片一部分被包含的自動配置。可以通過創建自定義的 @AutoConfigure… 註解或簡單地向測試添加 @ImportAutoConfiguration 來添加其他自動配置,如下例所示:

SpringBoot中文參考指南46.3.21自動配置的Spring REST Docs測試

<code>@RunWith(SpringRunner.class)
@JdbcTest
@ImportAutoConfiguration(IntegrationAutoConfiguration.class)
public class ExampleJdbcTests {

}/<code>

註釋:確保不要使用常規的 @Import 註解來導入自動配置,因為它們是由 Spring Boot 以特定方式處理的。

46.3.23、用戶配置和切片

如果你以一種合理的方式構造代碼,那麼你的 @SpringBootApplication 類將被默認用作測試的配置。

然後,不要將應用程序的主類與特定於其功能的特定區域的配置設置混雜在一起,這一點變得非常重要。

假設你正在使用 Spring Batch,並且依賴於它的自動配置。你可以像下面這樣定義 @SpringBootApplication:

SpringBoot中文參考指南46.3.21自動配置的Spring REST Docs測試

<code>@SpringBootApplication
@EnableBatchProcessing
public class SampleApplication { ... }/<code>

因為這個類是測試的源配置,任何切片測試實際上都試圖啟動 Spring Batch,這絕對不是你想要做的。建議的方法是將特定於區域的配置移動到與應用程序處於同一級別的單獨 @Configuration 類中,如下面示例所示:

SpringBoot中文參考指南46.3.21自動配置的Spring REST Docs測試

<code>@Configuration
@EnableBatchProcessing
public class BatchConfiguration { ... }/<code>

註釋:根據應用程序的複雜性,你可以為自定義設置使用單個 @Configuration 類,也可以為每個域區域使用一個類。後一種方法允許你在一個測試中啟用它,如果需要,可以使用 @Import 註解。

測試切片從掃描中排除 @Configuration 類。例如,對於 @WebMvcTest,以下配置不會在測試切片加載的應用程序上下文中包含給定的 WebMvcConfigurer bean:

SpringBoot中文參考指南46.3.21自動配置的Spring REST Docs測試

<code>@Configuration
public class WebConfiguration {
@Bean
public WebMvcConfigurer testConfigurer() {

return new WebMvcConfigurer() {
...
};
}
}/<code>

但是,下面的配置將導致測試切片加載自定義 WebMvcConfigurer。

SpringBoot中文參考指南46.3.21自動配置的Spring REST Docs測試

<code>@Component
public class TestWebMvcConfigurer extends WebMvcConfigurer {
...
}/<code>

混淆的另一個來源是類路徑掃描。假設,當你以合理的方式構建代碼時,你需要掃描一個額外的包。你的應用程序可能類似於以下代碼:

SpringBoot中文參考指南46.3.21自動配置的Spring REST Docs測試

<code>@SpringBootApplication
@ComponentScan({ "com.example.app", "org.acme.another" })
public class SampleApplication { ... }/<code>

這樣做有效地覆蓋了默認的組件掃描指令,其副作用是掃描這兩個包,而不考慮你選擇的切片。例如,@DataJpaTest 似乎突然掃描應用程序的組件和用戶配置。同樣,將自定義指令移動到單獨的類是解決此問題的好方法。

提示:如果這不是你的選項,你可以在測試層次結構中的某個位置創建 @SpringBootConfiguration,以便使用它。或者,可以為測試指定一個源,這將禁用查找默認源的行為。

46.3.24、使用 Spock 測試 Spring Boot 應用程序

如果你希望使用 Spock 測試 Spring Boot 應用程序,則應在應用程序的構建中添加對 Spock 的 spock-spring 模塊的依賴。spock-spring 將 Spring 的測試框架集成到 Spock 中。建議你使用 Spock 1.2 或更高版本,以受益於對 Spock 的 Spring Framework 和 Spring Boot 集成的許多改進。有關更多詳細信息,請參閱 Spock 的 Spring 模塊的文檔。(http://spockframework.org/spock/docs/1.2/modules.html#_spring_module )

下一篇[未完待續]


分享到:


相關文章: