40.3.10 自动配置的Spring REST Docs测试

如果想在测试类中使用Spring REST Docs,你可以使用@AutoConfigureRestDocs注解,它会自动配置MockMvc去使用Spring REST Docs,并移除对Spring REST Docs的JUnit规则的需要。

  1. import org.junit.Test;
  2. import org.junit.runner.RunWith;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
  5. import org.springframework.http.MediaType;
  6. import org.springframework.test.context.junit4.SpringRunner;
  7. import org.springframework.test.web.servlet.MockMvc;
  8. import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document;
  9. import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
  10. import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
  11. @RunWith(SpringRunner.class)
  12. @WebMvcTest(UserController.class)
  13. @AutoConfigureRestDocs("target/generated-snippets")
  14. public class UserDocumentationTests {
  15. @Autowired
  16. private MockMvc mvc;
  17. @Test
  18. public void listUsers() throws Exception {
  19. this.mvc.perform(get("/users").accept(MediaType.TEXT_PLAIN))
  20. .andExpect(status().isOk())
  21. .andDo(document("list-users"));
  22. }
  23. }

此外,除了配置输出目录,@AutoConfigureRestDocs也能配置将出现在任何文档化的URLs中的部分,比如host,scheme和port等。如果需要控制更多Spring REST Docs的配置,你可以使用RestDocsMockMvcConfigurationCustomizer bean:

  1. @TestConfiguration
  2. static class CustomizationConfiguration
  3. implements RestDocsMockMvcConfigurationCustomizer {
  4. @Override
  5. public void customize(MockMvcRestDocumentationConfigurer configurer) {
  6. configurer.snippets().withTemplateFormat(TemplateFormats.markdown());
  7. }
  8. }

如果想充分利用Spring REST Docs对参数化输出目录的支持,你可以创建一个RestDocumentationResultHandler bean,自动配置将使用它调用alwaysDo方法,进而促使每个MockMvc调用都会自动产生默认片段:

  1. @TestConfiguration
  2. static class ResultHandlerConfiguration {
  3. @Bean
  4. public RestDocumentationResultHandler restDocumentation() {
  5. return MockMvcRestDocumentation.document("{method-name}");
  6. }
  7. }