1

我想测试一个 REST 服务,它返回由 UUID 标识的给定实体的详细信息,即我的消费者协议有一个请求 GET 的交互,如下所示:

/城市/123e4567-e89b-12d3-a456-426655440000

所以我需要这个特定的记录存在于数据库中,以便协议验证者找到它。在其他项目中,我已经实现了在状态设置中执行 SQL INSERT,但在这种情况下,我更喜欢使用微服务的 JPA 实用程序来访问数据库,因为数据模型非常复杂,使用这些实用程序可以节省我付出了很多努力,并使测试更易于维护。

问题是这些实用程序不允许在您创建新记录时指定标识符(它们分配自动 ID)。因此,在创建实体(在状态设置中)之后,我想告诉协议验证者使用生成的 ID,而不是消费者协议指定的 ID。

据我所知,Pact 匹配技术在这里没有用处,因为我需要微服务来接收这个特定的 ID。验证者有没有办法知道在调用服务时使用的正确 ID?

4

3 回答 3

1

您在这里有两个选择:

选项 1 - 从协议文件中找到使用 UUID 的方法

这个选项(在我的选项中)会更好,因为您正在使用众所周知的值进行验证。使用 JPA,我认为您可以禁用 ID 的自动生成。如果您使用 Hibernate 作为 JPA 提供程序,如果您提供了一个 ID,它可能不会生成一个 ID(即在保存之前将实体上的 ID 设置为来自 pact 文件的 ID)。这是我最近所做的。

使用生成器(如 Beth 所述)将是解决此问题的一个很好的机制,但是目前没有提供生成器来使用特定值的方法。它们会即时生成随机的。

选项 2 - 替换 URL 中的 ID

根据您运行验证的方式,您可以使用请求过滤器将 URL 中的 UUID 更改为在提供程序状态回调期间创建的 UUID。但是,我觉得这可能是一件坏事,因为您可能会以削弱合同的方式更改请求。您将不会验证您的提供者是否遵守消费者指定的内容。

如果选择此选项,请注意仅更改 URL 的 UUID 部分,不要更改其他内容。

有关请求过滤器的信息,请查看Gradle - 在发送请求之前修改请求JUnit -在 Pact-JVM 自述文件中修改请求之前修改请求。

于 2017-09-23T07:12:58.377 回答
0

不幸的是没有。提供方验证者从协议文件本身获取此信息,因此不知道如何发送其他任何内容。

最好的选择是provider states在这个测试用例之前使用来管理特定记录的注入(或者首先在那里有正确的记录)。

您在提供程序状态设置期间使用 JPA 库将记录中的 UUID 修改为您所期望的。

于 2017-09-17T09:50:45.180 回答
0

如果您在消费者和提供者方面都使用 pact-jvm,我相信您可以使用“生成器”,但您需要查看相关文档,因为我没有使用它们。

于 2017-09-17T22:56:15.237 回答