SpringCloud 在服务器端执行自定义方法

2023-12-13 09:47 更新

本部分仅对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中的IntegerDouble等。
  • 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);


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号