restdocs SnippetException из-за HAL" ссылки " элементы из spring-data-rest
мое приложение использует spring-data-rest
и spring-restdocs
.
Моя настройка действительно стандартная; скопирована из документов почти полностью, но я включил образцы ниже, если я что-то пропустил.
Когда мой тест MVC запускается, он терпит неудачу с:
org.springframework.restdocs.snippet.SnippetException: The following parts of the payload were not documented:
{
"_links" : {
"self" : {
"href" : "https://my-api/item/10"
},
"item" : {
"href" : "https://my-api/item/10"
}
}
}
это мой тестовый код:
@Rule
public JUnitRestDocumentation restDocs = new JUnitRestDocumentation("target/generated-snippets");
// ...
mockMvc = webAppContextSetup(wac) //WebApplicationContext
.apply(documentationConfiguration(restDocs)
.uris()
.withHost("my-api")
.withPort(443)
.withScheme("https"))
.build();
// ....
mockMvc.perform(get("/items/{id}", "10"))
.andDo(documentation)
вот стека:
at org.springframework.restdocs.payload.AbstractFieldsSnippet.validateFieldDocumentation(AbstractFieldsSnippet.java:176)
at org.springframework.restdocs.payload.AbstractFieldsSnippet.createModel(AbstractFieldsSnippet.java:100)
at org.springframework.restdocs.snippet.TemplatedSnippet.document(TemplatedSnippet.java:64)
at org.springframework.restdocs.generate.RestDocumentationGenerator.handle(RestDocumentationGenerator.java:196)
at org.springframework.restdocs.mockmvc.RestDocumentationResultHandler.handle(RestDocumentationResultHandler.java:55)
at org.springframework.test.web.servlet.MockMvc.andDo(MockMvc.java:177)
at com.example.my.api.domain.MyRepositoryRestTest.findOne(MyRepositoryRestTest.java:36)
как сделать spring-restdocs
и spring-data-rest
по-хорошему?
ИЗМЕНИТЬ(Ы):
мой documentation
экземпляр определяется следующим образом:
ResultHandler documentation = document("items/findOne",
preprocessRequest(prettyPrint(), maskLinks()),
preprocessResponse(prettyPrint()),
responseFields(
fieldWithPath("name").description("Item name.")
// Bunch more
));
как указал @meistermeier, (и после документы restdocs для игнорирования ссылок, я могу добавить
links(linkWithRel("self").ignored(),
linkWithRel("_self").ignored().optional()) // docs suggest this. /shrug
но это все еще оставляет меня с:
SnippetException: Links with the following relations were not documented: [item]
кажется _links
всегда будет ссылка на тот же объект, верно?
Как я могу чисто справиться с этим, не игнорируя ссылку на объект для каждого теста, например:
links(linkWithRel("item").ignored())
даже если я do добавьте вышеуказанную строку (чтобы все поля self
_self
curies
и item
все ignored()
и/или optional()
), результат теста возвращается к исходной ошибке в верхней части этого вопроса.
1 ответов
кажется, что _links всегда будет иметь эту само-ссылку на ту же сущность, верно?
Да, правильно.
у меня может быть ваше решение для игнорирования некоторых ссылок в небольшой образец github. Особенно в рубрике:
mockMvc.perform(RestDocumentationRequestBuilders.get(beerLocation)).andExpect(status().isOk())
.andDo(document("beer-get", links(
linkWithRel("self").ignored(),
linkWithRel("beerapi:beer").description("The <<beers, Beer resource>> itself"),
linkWithRel("curies").ignored()
),
responseFields(
fieldWithPath("name").description("The name of the tasty fresh liquid"),
fieldWithPath("_links").description("<<beer-links,Links>> to other resources")
)
));
где я полностью игнорирую все "автоматически" поля и только создать запись документации для домена. Ваш item
ссылка будет моей beerapi:beer
.
Я действительно не знаю, что здесь лучше всего, но я всегда буду документировать как можно больше, так как вы можете использовать ссылки asciidoctor (например,<<beer-links,Links>>
) по возможности ссылаться на другие части новой документацией.