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

协议-使用提供程序状态

罗寒
2023-03-14

我正在尝试使用pact来验证spring boot微服务。我已经从consumer生成了pact文件,并在provider端使用pact Broker验证了它。

我有另一个用例,在根据实际的服务响应验证pact文件之前,我需要执行一些代码。我读过关于状态改变URL和状态改变与闭包来实现它,但没有得到一个如何实现这一点的例子。有人能帮忙吗?

如果这个客户不存在,那么我将需要通过读取pact文件中的更新请求中的名字、姓氏、id以及通过状态更改代码的附加信息(城市、州、电话号码),将这个数据插入到DB中。

所以我的问题是,我是否可以通过状态更改从pact文件中读取请求数据,而不是在验证端配置名字、姓氏和id?

共有1个答案

夏侯智鑫
2023-03-14

state change URL是您在提供程序上创建的一个钩子,它允许Pact在测试开始时告诉提供程序它应该处于什么状态。在每次测试运行之前,模拟使用者点击提供程序上的状态更改URL,并告诉它测试所期望的状态的名称。

你需要做两件事:

  1. 配置状态更改URL
  2. 在提供程序上实现状态更改终结点
<serviceProvider>
  <name>provider1</name>
  <stateChangeUrl>http://localhost:8080/tasks/pactStateChange</stateChangeUrl>
...
hasPactWith('consumer1') {
 stateChangeUrl = url('http://localhost:8080/tasks/pactStateChange')
...

上面链接的文档告诉我们,默认情况下,请求的格式是您的状态字符串和任何参数的POST请求:

{ "state" : "a provider state description", "params": { "a": "1", "b": "2" } }

要使用它,您需要在提供程序上实现类似以下未经测试的代码:

@RequestMapping(value = "tasks/pactStateChange", method = RequestMethod.POST)
ResponseEntity<?> stateChange(@RequestBody ProviderState state) {
   if (state.state == "no database") {
       // Set up state for the "no database" case here
   } else if state.state == "Some other state" {
       // Set up state here
   } else if  ...   // Other states go here
   ... 
   }

   return ResponseEntity.ok().build()
}

请原谅那个例子中的任何Spring引导错误--我不是一个Spring引导的人,但你可以看到一般的原理。

使用状态更改URL,pact不会告诉提供商任何安装细节。它只是告诉提供者您在测试中使用的预先同意的状态字符串。这可能类似于“foo exists”。然后,当实现状态更改URL的处理程序时,您会检测“foo exists”,并在那里进行任何显式设置。

if (state.state == "foo exists") {
     // do whatever you need to set up so that foo exists
    repository.clear()
    repository.insert(new Foo("arguments that foo needs",12))
}

如果您想了解更多关于提供者状态的意图,请阅读有关提供者状态的wiki页面。

你问:

  • 我的测试是请求客户更新。如果客户存在,那么我希望得到X响应,如果客户不存在,那么我希望得到Y响应

你用两个测试来说明:

>

  • 当我向客户记录提交更新时(处于客户存在时的状态),那么我期望X响应。

    当我向客户记录提交更新时(在客户不存在的状态下),那么我期望Y响应。

    这些测试是您的契约合同中的两个单独的项目。

    其意图不是在合同中包含设置的细节。在消费者端,您的状态只是一个字符串,表示类似于“ID=1234的客户存在”。

    if (state == "Customer with id=1234 exists") {
      Database.Clear()
      Database.Insert(new Customer(1234, "John","Smith")) 
    } else if (state == "No customers exist") { 
      Database.Clear()
    }
    

    使用者测试不应该知道如何设置提供者状态,他们应该只知道测试需要什么状态(仅通过名称)。类似地,提供者不需要知道正在测试什么,它只需要知道如何将状态名称转换为实际状态。

  •  类似资料:
    • 我正在尝试配置TomEE(带有Java EE的Tomcat)以使用AMQP Wire协议连接到外部代理(Azure Service Bus)。缺省情况下,JMS提供程序似乎是ActiveMQ。根据文档,ActiveMQ确实支持AMQP协议。我的目标是使用ActiveMQ作为TomEE提供的JMS提供程序。但是,部署基本ear文件时,会出现以下错误: 有人将ActiveMQ与AMQP一起使用吗?或者

    • 下面是我的app.js文件 下面是我的状态文件 我有一个模板,我想从那里导航到下一个状态 但是只要我点击这个锚标签,它就会把我导航回主页。(不去我打算去的州)。主要问题是URL(我猜)任何帮助都会很感激。

    • 我在不安全的T3连接上使用外部JNDI提供程序来访问本地实例上的远程WebLogic资源。现在我必须切换到安全连接(T3S),并使用带有自签名证书的双向身份验证。到目前为止,我已经尝试了以下几点: 在远程管理服务器上启用SSL侦听端口 在客户端和远程服务器上使用Java keytool生成keypair 将两台服务器配置为使用keystore/key 将自签名证书导出到对手的信任存储区(cacer

    • 通过参考Pact Repo中给出的示例,我为MessageProvider编写了示例Pact测试。下面是使用者测试,它正在为预期来自提供者的消息生成PACT json文件。 公共类Inbound_Receiving_OpenMessageTest{private byte[]receivingopenloaddetailsmessage; }

    • 我正在使用Spring Security 4.0.1,并希望使用多个身份验证提供程序使用基于Java的配置进行身份验证。如何指定提供程序顺序? 我希望使用AuthenticationManagerBuilder,因为这就是<code>WebSecurityConfigurerAdapter。configureGlobal()公开,但我看不到任何指定顺序的方法。我需要手动创建ProviderMana

    • 有可能发球吗。只使用来自节点的http模块,而不使用任何其他框架?我是否拥有一个简单web应用程序所需的所有功能? 这就是我尝试过的: 是否有一些步骤我错过了,或者我需要阅读一些东西来了解文件是如何链接的?