Spring Cloud Contract、body和execute方法未验证响应



我有以下春季云合约:

package contracts.teams
import org.springframework.cloud.contract.spec.Contract
Contract.make {
name"d Find team roles by filters"
description "Find team roles by filters"
request {
method "POST"
url "api/team/findTeamRolesByFilters"
headers {
contentType applicationJson()
accept applicationJson()
header"Authorization", execute('bearerOfAccessToken()')
}
body execute('getRequestForFindTeamRolesByFilters()')
}
response {
status OK()
headers {
contentType applicationJson()
}
body execute('getResponseForFindTeamRolesByFilters()')
}
}

我在响应处调用getResponseForFindTeamRolesByFilters((,以便从服务器生成动态响应。例如,原因可能是来自DB的自动生成的id。getResponseForFindTeamRolesByFilters((生成的字符串是一个有效的JSON,不幸的是,它在测试运行时被忽略并始终返回true。

当我用如下静态响应替换execute方法时,我注意到了这一点:

"""
{
"success": "false"
}
"""

在这种情况下,响应被正确验证,如果不匹配,则测试失败。我所说的正被测试生成的代码所证实,如图所示:

// then:
assertThat(response.statusCode()).isEqualTo(200);
assertThat(response.header("Content-Type")).matches("application/json.*");
// and:
DocumentContext parsedJson = JsonPath.parse(response.getBody().asString());
getResponseForFindTeamRolesByFilters();

正如你所看到的,没有断言。它只是简单地调用生成json的方法。

我应该如何让测试检查动态json响应?非常感谢。

我在响应处调用getResponseForFindTeamRolesByFilters((,以便从服务器生成动态响应。

您不应该这样做。合同测试不应该访问数据库。

对于消费者,你应该做

request {
method "POST"
url "api/team/findTeamRolesByFilters"
headers {
contentType applicationJson()
accept applicationJson()
header"Authorization", execute('bearerOfAccessToken()')
}
body $(producer(execute('getRequestForFindTeamRolesByFilters()')), consumer("some value to be put on the consumer side"))
}

对于生产者

response {
status OK()
headers {
contentType applicationJson()
}
body $(producer(execute('getResponseForFindTeamRolesByFilters()')), consumer("something in the stub"))
}

最新更新