SpringCloud 在服务器端执行自定义方法
本部分仅对Groovy DSL有效。请查看 “匹配器节中的动态Properties”一节,以获取类似功能的YAML示例。
您可以定义在测试期间在服务器端执行的方法调用。可以将这种方法添加到配置中定义为“ baseClassForTests”的类中。以下代码显示了测试用例的合同部分的示例:
org.springframework.cloud.contract.spec.Contract.make {
request {
method 'PUT'
url $(consumer(regex('^/api/[0-9]{2}$')), producer('/api/12'))
headers {
header 'Content-Type': 'application/json'
}
body '''\
[{
"text": "Gonna see you at Warsaw"
}]
'''
}
response {
body(
path: $(consumer('/api/12'), producer(regex('^/api/[0-9]{2}$'))),
correlationId: $(consumer('1223456'), producer(execute('isProperCorrelationId($it)')))
)
status OK()
}
}
以下代码显示了测试用例的基类部分:
abstract class BaseMockMvcSpec extends Specification { def setup() { RestAssuredMockMvc.standaloneSetup(new PairIdController()) } void isProperCorrelationId(Integer correlationId) { assert correlationId == 123456 } void isEmpty(String value) { assert value == null } }
您不能同时使用String和
execute来执行串联。例如,呼叫header('Authorization', 'Bearer ' + execute('authToken()'))会导致不正确的结果。而是调用header('Authorization', execute('authToken()'))并确保authToken()方法返回您需要的所有内容。
从JSON读取的对象的类型可以是以下之一,具体取决于JSON路径:
String:如果您指向JSON中的String值。JSONArray:如果您指向JSON中的List。Map:如果您指向JSON中的Map。Number:如果您指向JSON中的Integer,Double等。Boolean:如果您指向JSON中的Boolean。
在合同的请求部分,您可以指定body应该从方法中获取。
您必须同时提供消费者和生产方。
execute部分适用于整个身体-不适用于部分身体。
以下示例显示如何从JSON读取对象:
Contract contractDsl = Contract.make {
request {
method 'GET'
url '/something'
body(
$(c('foo'), p(execute('hashCode()')))
)
}
response {
status OK()
}
}
前面的示例导致在请求正文中调用hashCode()方法。它应类似于以下代码:
// given: MockMvcRequestSpecification request = given() .body(hashCode()); // when: ResponseOptions response = given().spec(request) .get("/something"); // then: assertThat(response.statusCode()).isEqualTo(200);