В Spring REST Docs я могу документировать поля ответа JSON. Кроме того, я могу указать тип, в котором я могу передать JsonFieldType
, например JsonFieldType.STRIGN
. Это будет фактически подтверждено, что означает, что тест завершится неудачно, например, когда вместо этого возвращается число.
(...)
.andDo( document( "one-valid-connection",
pathParameters( parameterWithName( "ip" ).description( "The requested IPv4 address." ) ),
responseFields(
fieldWithPath( "username" ).type( JsonFieldType.STRING ).description( "The name of the user that initiated the connection." ),
fieldWithPath( "ipAddress" ).type( JsonFieldType.STRING ).description( "The IPv4 address of the user." ),
fieldWithPath( "startTime" ).type( JsonFieldType.STRING ).description( "The time (ISO 8601 format) when the connection has been initiated." ),
fieldWithPath( "stopTime" ).type( JsonFieldType.STRING ).description( "The time (ISO 8601 format) when the connection has been terminated or `null` if connection is still active." )
)
) );
Мой вопрос: можно ли писать собственные типы для поддержки, например. IP-адреса, временные метки ISO, перечисления и, возможно, даже допустимые числовые диапазоны а также для поддержки настраиваемой проверки (например, регулярное выражение или более сложная логика)?
В качестве псевдокода что-то вроде
responseFields(
fieldWithPath( "username" ).type( JsonFieldType.STRING )
fieldWithPath( "ipAddress" ).type( CustomTypes.IPV4_ADDRESS ),
fieldWithPath( "startTime" ).type( CustomTypes.ISO8601_TIMESTAMP ),
fieldWithPath( "stopTime" ).type( CustomTypes.ISO8601_TIMESTAMP ),
fieldWithPath( "type" ).type( CustomTypes.CONNECTION_ENUM ),
fieldWithPath( "duration" ).type( CustomTypes.createIntRange(0,999999) )
)
ИМХО, нет никакого разумного, простого (т.е. использующего только точки, в которых Spring открыт для расширения) решения.
Основная цель Spring Restdocs - это документ, а не подтверждать API. Когда я просматривал источники, фактический экземпляр полезной нагрузки тестировался только на соответствие предопределенным типам. Ценности далее не анализируются. Хотя вы можете указать любой Object
в качестве типа дескриптора поля, т.е. вы не ограничены только объектами класса JsonFieldType
, весь объект, по сути, преобразуется только toString
для записи в какой-то документ asciidoc, и все.
Кстати, я разработан с идеей использования Restdocs в качестве инструмента проверки структуры. В моем случае я нашел приемлемое решение. Исходный код Spring Restdocs довольно закрыт, поэтому, основываясь на моем опыте изучения внутреннего устройства, я рекомендую вам не пробовать какие-либо хакерские решения, такие как переопределение методов org.springframework.restdocs.payload.JsonContentHandler#determineFieldType
или org.springframework.restdocs.payload.JsonFieldTypeResolver#resolveFieldType
(что в любом случае потребовало бы нарушения защиты видимости с помощью инструментов инструментария классов).
Другая идея - использовать аннотации проверки bean-компонентов.
«Основная цель Spring Restdocs - документировать, а не проверять API». Я знаю, но он обеспечивает проверку типов JSON, которые кажутся довольно случайными. Но спасибо за подробный ответ. Я еще не проверял исходники, но, к сожалению, он закрыт для расширения :(