我正在为一个http请求写一个 spring cloud contract ,其中一个json主体,其中一个字段(我们称之为 myMap )应该是 non空映射(字符串到字符串)。所以请求者(又名消费者)必须有这样的东西: " myMap":{" key":" val"}
是否有可能在合同中强制执行此类事情?
这里是我为了确保上下文而写的现有合约的一个例子:
package contracts
org.springframework.cloud.contract.spec.Contract.make {
description("""
Represents a successful scenario of registering new host
given:
hostProperties are valid
then:
we'll register the host
""")
request {
method 'POST'
urlPath value(consumer(~/\/api\/hosts\/[a-zA-Z0-90-9]+/), producer('/api/hosts/icsl7875'))
body([
timeStamp : $(consumer(anyNumber()), producer(334)),
hyperThreaded : $(consumer(regex('^(true|false)$')), producer(false)),
virtualMachine: $(consumer(regex('^(true|false)$')), producer(false)),
poolName : $(consumer(regex('(.+)')), producer("dev_regression")),
osImage : $(consumer(regex('(.+)')), producer("osImage1")),
cores : $(consumer(anyNumber()), producer(2)),
memory : $(consumer(anyNumber()), producer(256)),
osRelease : $(consumer(regex('(.+)')), producer("osRelease1")),
wsmVeriosn : $(consumer(regex('(.+)')), producer("8.2.16")),
cpuCount : $(consumer(anyNumber()), producer(2445L)),
cpuMhz : $(consumer(anyNumber()), producer(22354L)),
cpuMips : $(consumer(anyNumber()), producer(256F))
])
headers {
contentType(applicationJsonUtf8())
}
}
response {
status 201
body([
groupId: $('067e6162-3b6f-4ae2-a171-2470b63dff00')
])
headers {
contentType(applicationJson())
}
}
}
答案 0 :(得分:1)
FOR REQUEST
我想你可以使用stubMatcher
部分。只有存在条目时才应解决WireMock中的JSON路径。因此,如果您传入stubMatcher
正确的json路径并验证它byEquality
,那么它应该没问题。
FOR RESPONSE:
您可以使用testMatcher
部分并与byCommand
(https://cloud.spring.io/spring-cloud-contract/1.0.x/#_dynamic_properties_in_matchers_sections)一起委托。在该方法中,您必须验证条目是否为空。在文档中,有jsonPath('$.duck', byCommand('assertThatValueIsANumber($it)'))
。你需要做类似的事情,但断言条目是非空的。