为啥 WireMock 说请求不匹配?春天云合约

Posted

技术标签:

【中文标题】为啥 WireMock 说请求不匹配?春天云合约【英文标题】:Why WireMock says that the Request not matches? Spring cloud contract为什么 WireMock 说请求不匹配?春天云合约 【发布时间】:2017-12-28 09:19:09 【问题描述】:

Wiremock 记录以下请求不匹配:

    WireMock                                 : Request was not matched:

  "url" : "/api/accounts?username=defaultuser",
  "absoluteUrl" : "http://localhost:11651/api/accounts?username=defaultuser",
  "method" : "GET",
  "clientIp" : "127.0.0.1",
  "headers" : 
    "authorization" : "bearer test123",
    "accept" : "application/json, application/*+json",
    "user-agent" : "Java/1.8.0_121",
    "host" : "localhost:11651",
    "connection" : "keep-alive"
  ,
  "cookies" :  ,
  "browserProxyRequest" : false,
  "loggedDate" : 1500711718016,
  "bodyAsBase64" : "",
  "body" : "",
  "loggedDateString" : "2017-07-22T08:21:58Z"

Closest match:

  "urlPath" : "/api/accounts",
  "method" : "GET",
  "headers" : 
    "authorization" : 
      "matches" : "^bearer"
    ,
    "accept" : 
      "equalTo" : "application/json, application/*+json"
    ,
    "user-agent" : 
      "equalTo" : "Java/1.8.0_121"
    ,
    "host" : 
      "matches" : "^localhost:[0-9]5"
    ,
    "connection" : 
      "equalTo" : "keep-alive"
    
  ,
  "queryParameters" : 
    "username" : 
      "matches" : "^[a-zA-Z0-9]*$"
    
  

问题是因为url和urlPath的不同吗? 我还尝试在合同中指定 absoluteUrl。但它被忽略了。我猜是因为它没有在合同 DSL 中定义。

合约的请求方如下所示:

request
        method 'GET'
        url('/api/accounts')
            queryParameters 
                parameter('username', $(consumer(regex('^[a-zA-Z0-9]*$')), producer('defaultuser')))
            
        
        headers 
            header('authorization', $(consumer(regex('^bearer')), producer(execute('authClientBearer()'))))
            header('accept', $(consumer('application/json, application/*+json')))
            header('user-agent', $(consumer('Java/1.8.0_121')))
            header('host', $(consumer(regex('^localhost:[0-9]5'))))
            header('connection', $(consumer('keep-alive')))
        
    

【问题讨论】:

我认为您匹配的授权标头是错误的。你应该用它来结束它。* 我改了。但仍然不匹配。 在发送的请求中尝试在查询参数前添加/。如果这不起作用,您可以按顺序更改合同并监控不匹配的内容。换句话说,做一个简单的获取 URL,然后添加查询参数和标题。 我会试试的。我还有第二份合同,其网址相同,但带有电子邮件查询参数。 WireMock 是否有可能仅根据 url 做出决定?因此,如果我有两个具有相同 url 但查询参数不同的合同,则无法选择正确的合同? 不,我不这么认为。它在 url 的末尾敲响了关于丢失 / 的铃声 【参考方案1】:

原来是合同/存根中的URL末尾缺少/

【讨论】:

【参考方案2】:

与问题没有直接关系,但适用于所有来自 Google 的人:

在我的情况下,我处于错误的场景状态。

更多关于场景状态的信息:http://wiremock.org/docs/stateful-behaviour/

【讨论】:

以上是关于为啥 WireMock 说请求不匹配?春天云合约的主要内容,如果未能解决你的问题,请参考以下文章

如何根据使用wiremock和JSON的请求正文匹配获得响应

正则表达式.+可以匹配空格,但是[.\w]+却不匹配,为啥?

测试工具Wiremock介绍

如何在 WireMock 中使请求文件先于另一个文件执行?

Wiremock Stand alone - 如何使用请求数据操作响应

为啥python说一个字符串与另一个字符串不匹配[重复]