【问题标题】: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 的末尾敲响了关于丢失 / 的铃声

标签: spring-boot spring-cloud spring-cloud-netflix wiremock spring-cloud-contract


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-22
      • 1970-01-01
      相关资源
      最近更新 更多