Java 如何从序列化静态对象派生契约体?
让我先说一下,我来自dotnet背景,对Java不太熟悉。我正试图通过共享将用作控制器模式的对象,最大限度地减少用户更新contract/DTO对象的需要。例如,使用openAPI生成架构:Java 如何从序列化静态对象派生契约体?,java,spring-cloud-contract,openapi-generator,Java,Spring Cloud Contract,Openapi Generator,让我先说一下,我来自dotnet背景,对Java不太熟悉。我正试图通过共享将用作控制器模式的对象,最大限度地减少用户更新contract/DTO对象的需要。例如,使用openAPI生成架构: mysample.yml openapi: "3.0.2" paths: /mySampleEndpoint: post: operationId: sample requestBody: content: app
mysample.yml
openapi: "3.0.2"
paths:
/mySampleEndpoint:
post:
operationId: sample
requestBody:
content:
application/json:
schema:
$ref: "https://remote.definition.for.sampleendpoint.request.definition.yml#components/schemas/SampleEndpointDefinition"
#response removed for brevity
到目前为止,它工作得非常出色,但是当我想编写契约测试时,它就变得有点困难了。我希望我的消费者通过序列化这个共享对象的一个实例来生成他们的请求,而不是为主体编写json对象,我希望通过序列化请求对象的一个静态最终实例来编写请求对象
当前生成契约测试的方法是通过.yml或.groovy文件,我将使用groovy格式,因为我认为它在这种情况下更有前途
ContractCheckV1.groovy (as documented)
[
Contract.make{
request {
method: 'POST'
urlPath ('api/v1/mySampleEndpoint')
headers: {
header('Content-Type': 'application/json')
}
body( """
{
"foo": 1,
"bar": "value",
"baz": false
}
""")
}
response {
status 200
}
}
]
很容易看出,如果我们最终得到足够复杂的对象,请求主体可能会变得很麻烦,所以我宁愿这样做。抱歉,我将使用C#语法,因为它更简洁
myTestDate.csJava //why am I doing this?
public static class myTestData () {
public static SampleEndpointDefinition testObject (){
return new SampleEndpointDefinition{
foo = 1,
bar = "value",
baz = false
};
}
}
我们希望在.groovy文件中使用它,如下所示:
ContractCheckV1.groovy //as desired
SampleEndpointDefinition successObject = myTestData.testObject();
ObjectMapper mapper = new ObjectMapper();
string successObjectJson = mapper.writeValueAsString(successObject);
[
Contract.make{
request {
method: 'POST'
urlPath ('api/v1/mySampleEndpoint')
headers: {
header('Content-Type': 'application/json')
}
body( successObjectJson )
}
response {
status 200
}
}
]
由于生成的代码与myTestData或SampleObjectDefinition交互的方式,在尝试拉入myTestData或SampleObjectDefinition的包时似乎存在编译顺序问题。我不知道如何进步。感谢您的帮助。如果您的对象有一个将返回的静态映射(作为json体),那么您不必将其序列化为json。你把地图交给合同就够了 但是,如果您不能使用映射,并且它必须是一个结构,那么您可以使用groovy JsonOutput,而不是类路径上需要的对象映射器
还要记住,您的这个类需要同时出现在consuner和producer端的类路径上。这里有一个示例(这里有一个带有公共代码的jar,然后您可以检查生产者和消费者是如何设置为引用该代码的。如果您的对象有一个静态映射,它将返回(作为json体),那么您不必将其序列化为json。您只需将该映射传递给契约即可 但是,如果您不能使用映射,并且它必须是一个结构,那么您可以使用groovy JsonOutput,而不是类路径上需要的对象映射器
还要记住,您的这个类需要同时出现在consuner和producer端的类路径上(这里是带有公共代码的jar,然后您可以检查生产者和消费者如何设置以引用该代码。部分问题在于SampleEndpointDefinition的类是由OpenApigator生成的。签名在远程.yml文件中定义,并构建到java文件中,该文件似乎无法导入到合同中。groovy,因为它没有打包到JAR中,而是项目中的一个兄弟。因为yml源代码是远程的,所以在生产者和消费者之间分发很简单。如果我的命名法不正确,我表示歉意,因为我不习惯javaland。部分问题是SampleEndpointDefinition的类是由openapiGenerator生成的。signaTrue在一个远程.yml文件中定义,并构建到一个java文件中,该文件似乎无法导入contracts.groovy,因为它没有打包到JAR中,而是项目中的一个兄弟。因为yml源代码是远程的,所以在生产者和消费者之间分发很简单。如果我的命名法不正确,我不使用,我道歉d去爪哇岛。