我想测试一个REST服务,该服务返回由UUID标识的给定实体的详细信息,即我的消费者协议有一个请求GET的交互:
/城市/ 123e4567-e89b-12D3-a456-426655440000
因此我需要在数据库中存在此特定记录,以便pact验证程序找到它。在其他项目中,我已经实现了在状态设置中执行SQL INSERT,但在这种情况下,我更喜欢使用微服务的JPA实用程序来访问数据库,因为数据模型是相当复杂,使用这些实用程序可以节省我很多精力,使测试更易于维护。
问题是这些实用程序在创建新记录时不允许指定标识符(它们分配自动ID)。因此,在创建实体(在状态设置中)之后,我想告诉pact验证者使用生成的ID而不是消费者协议指定的ID。
据我所知,Pact匹配技术在这里没用,因为我需要微服务来接收这个特定的ID。有没有办法让验证者知道在服务调用中使用的正确ID?
答案 0 :(得分:0)
不幸的是没有。提供者方验证者从pact文件本身获取此信息,因此无法知道如何发送任何其他内容。
最好的选择是在此测试用例之前使用provider states
来管理特定记录的注入(或者首先在那里记录正确的记录)。
您在提供者状态设置期间使用JPA库将记录中的UUID修改为您期望的内容。
答案 1 :(得分:0)
如果你在消费者和提供者方面使用pact-jvm,我相信你可以使用'生成器',但是你需要查看文档,因为我还没有使用它们。
答案 2 :(得分:0)
这里有两个选项:
选项1 - 找一种从pact文件中使用UUID的方法
这个选项(在我的选项中)会更好,因为您使用众所周知的值进行验证。使用JPA,我认为您可以禁用自动生成ID。如果您使用Hibernate作为JPA提供程序,如果您提供了一个ID,它可能不会生成ID(即在保存之前将实体上的ID设置为pact文件中的ID)。这就是我最近所做的。
使用生成器(如Beth所述)将是解决此问题的良好机制,但目前没有方法可以提供生成器来使用特定值。它们会动态生成随机数据。
选项2 - 替换网址中的ID
根据您运行验证的方式,您可以使用请求筛选器将URL中的UUID更改为在提供程序状态回调期间创建的UUID。但是,我觉得这可能是一件坏事,因为你可以通过削弱合同的方式来改变请求。您不会验证您的提供商是否遵守消费者指定的内容。
如果选择此选项,请注意仅更改URL的UUID部分,而不是其他任何内容。
有关请求过滤器的信息,请查看Pact-JVM自述文件中的Gradle - Modifying the requests before they are sent和JUnit - Modifying the requests before they are sent。