当前位置: 首页 > 知识库问答 >
问题:

Spring云契约、主体和执行方法未验证响应

宋耀
2023-03-14

我有以下spring cloud合同:

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()')
    }
}

为了从服务器生成动态响应,我在响应处调用get响应。例如,原因可能是来自数据库的自动生成的id。从get响应ForFindTeamRletByFilters()生成的字符串是一个有效的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响应?谢谢!

共有1个答案

宋宏毅
2023-03-14

为了从服务器生成动态响应,我在响应处调用get响应。

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

对于消费者,你应该这样做

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"))
}
 类似资料:
  • 关于本话题请先参考验证契约一节的介绍。 使用rake pact:verify 使用pact:verify任务是最常见的验证契约的方式。这也是配置你的服务提供者应遵守的契约的默认集之处。 在Rakefile中引入'pact/tasks'就可以使用了。 # In Rakefile require 'pact/tasks' # Remember to add it to your default Ra

  • “验证契约”是Pact测试过程中的第二步。契约文件中的每个请求会在提供者上进行重放,所返回的响应将会被用于与契约文件中的期望响应进行对比,如果两者匹配,我们就可以确信消费者和提供者能够保持兼容。 要验证契约,应该这样做: 配置待验证契约的位置。可以是一个HTTP URL,也可以是一个本地文件系统路径。 在提供者状态中预置数据。 (可选项)对将被用于播放请求的服务提供者应用进行配置。 关于如何在代码

  • 每个人 因此,我有一个SpringBoot应用程序,它带有一个控制器,该控制器有几种方法,将以下POJO作为参数: 对于其中一个控制器endpoint,我想应用额外的验证逻辑,因此在我添加了以下内容: 是我想要应用的约束注释。 我的问题是,只有在中定义的检查成功通过时,才会调用此附加约束。如果为空,约束将被忽略,客户端将收到不完整的验证结果。我错过了什么?

  • 使用方法创建新资源时,将新资源的位置添加到响应中,作为标头。 如何创建一个spring云契约YML来验证响应是否包含头,并将有效的作为其值? 我试过下面的YAML,但它不工作。 生成测试代码 生成的代码不包含任何头验证。

  • 我知道rest assure中有很多关于验证的信息,但不幸的是,我无法找到我的问题的确切解决方案。 我正在训练以验证以下JSON的响应: 具有以下代码: 期望值返回 g1 和 g2 的列表。 我得到的错误是: 我怎样才能做到这一点?

  • 我已经在一个Spring Boot项目中创建了一个Spring云契约存根()。希望调用此存根的客户机不是Spring项目,也不可能是Spring项目。如果我在客户端中运行以下命令: 然后我得到一个错误 显然,我没有,因为这不是一个Spring Boot项目。 这里有什么变通办法?