Spring Rest Docs 如何在我的代码片段或 .adoc 文件中包含应用程序名称

Spring Rest Docs How do I include the application name in my snippets or .adoc file

我正在尝试将 Spring Rest Docs 包含在 Spring 引导应用程序中,并已设法生成一个简单的 asciidoc HTML 文件,显示应用程序根目录的请求路径 ' /'。问题是代码段中的请求 URL 不包含应用程序名称?例如,我的应用程序名为 'myservice',所以我希望将根“/”请求路径记录为

$ curl 'http://localhost:8080/myservice/'

相反我只能生成

$ curl 'http://localhost:8080/'

我是 Spring Rest Docs 的新手,不知道如何在记录的 URL 中包含应用程序名称。它是在 asccidoctor 的 maven 插件中设置的,在测试的 @before 或 @Test 方法中 class 还是在 .adoc 文件中作为 'include' 标记的一部分?

这是mentioned in the documentation:

To configure a request’s context path, use the contextPath method on MockHttpServletRequestBuilder.

在您的示例中,您的应用程序名为 myservice,而您正在请求 /。您的 MockMvc 调用应如下所示:

this.mockMvc.perform(get("/myservice/").contextPath("/myservice"))
        .andExpect(status().isOk())
        .andDo(document("index"));

我让它工作的方法是将上下文路径包含为其余 URI 的一部分,并在 RequestBuilder 上调用 contextPath。这是工作示例。在我的示例中,"api" 是上下文根。我必须将其包含在请求中,并在 RequestBuilder 上调用 contextPath 方法并进行设置。

@Andy Wilkinson:我知道这可能会重复您所说的话,但我认为完整的工作示例对于像我这样的人来说会更清楚:)

@RunWith(MockitoJUnitRunner.class)
public class UserControllerTest {


    private UserController controller;

    private MockMvc mockMvc;

    @Rule
    public RestDocumentation restDocumentation = new RestDocumentation("target/generated-snippets");

    @Before
    public void setUp() {

        controller = new UserController();
        mockMvc = standaloneSetup(controller).apply(documentationConfiguration(this.restDocumentation)).build();
    }

    @Test
    public void testUsers() throws Exception {

        this.mockMvc.perform(get("/api/users/{userId}","1234").contextPath("/api"))
                .andExpect(status().isOk())
                .andDo(document("user-information", pathParameters(
                        parameterWithName("userId").description("user id.")
                ), responseFields(
                        fieldWithPath("firstName").description("first name of the user. "),
                        fieldWithPath("lastName").description("Last name of the user. ")

                )))
                .andDo(print());

    }
}