java 如何在wirerock中使用“优先级”

yqkkidmi  于 2022-12-10  发布在  Java
关注(0)|答案(3)|浏览(171)

我想了解优先级是如何工作的。更具体地说,将优先级设置为存根的预期输出是什么。关于这方面的文档有限,可用的文档并没有真正解释输出是什么样子的,所以我无法验证我是否正确地实现了它。
这是我目前的代码:

stubFor(post(urlMatching("/user/test\\?(and)\\=(que).*")).atPriority(1)
    .willReturn(aResponse()
              .withStatus(200)
                      .withHeader("Content-Type", "text/plain")
                      .withBody("This stub is testing for Title ")
              )
        );   

   System.out.println("About to execute the second stub");
            stubFor(post(urlMatching("/user/test\\?(and)\\=(que).*")).atPriority(2)
    .willReturn(aResponse()
              .withStatus(200)
                      .withHeader("Content-Type", "text/plain")
                      .withBody("This stub is testing Author ID ")
              )
        );

            System.out.println("Second stub executed");

我正在从SOAPUI发送以下请求:

/user/test?and=query

因此,应该执行两个存根,我应该收到两个响应,对吗?
我目前只收到一个响应,来自优先级为1的存根。我没有从优先级为2的存根收到任何响应/
谁能帮帮我吗?

czq61nw1

czq61nw11#

您到底想要达到什么目的?您通常有Wirerock配置,它们具有不同的请求参数或重叠。在您的情况下,它们完全相同。在哪种情况下应该显示第一个,在哪种情况下应该显示第二个?
Wiremock始终只返回一个答案。此答案通常由您在Wiremock配置中定义的请求参数的评估确定。有关Wiremock和优先级如何工作的信息,请参阅以下说明:Wiremock Stubbing and priorities
如果有重叠的参数,Wiremock将选择您最近添加的配置(在您的情况下是第二个)。或者您可以通过设置优先级来指导Wiremock。优先级较低的将被优先使用。
通常情况下,你有一个更一般的情况(较少的请求参数-作为追赶)和一个更具体的情况。第一个将获得更高的优先级(如9)和后者一个较低的(e.q. 5)。因此,后者将被优先选择,如果请求参数匹配,在其他情况下,第二个。

yqyhoc1h

yqyhoc1h2#

如@monsIgnore所述,对于重叠参数,将选择与这些参数匹配的最近添加的Map。
当我最初在Wiremock中查看请求匹配时,我认为会选择最精确的匹配。
“最精确”是指与请求中最多元素匹配的Map。例如,给定以下两个Map(按此顺序添加):

Map1

"request" : {
    "url" : "/oauth2/rest/consent",
    "method" : "GET",
    "headers" : {
      "Cookie" : {
        "equalTo" : "OAM_ID=VERSION_5"
      }
    }
  }

Map2

"request" : {
    "url" : "/oauth2/rest/consent",
    "method" : "GET"
  }

如果接收到对url /oauth2/rest/consentVERSION_5的OAM_ID cookie的请求,则与最多元素匹配的Map为Map1
但是,选择了Map2,因为它匹配并且是最近添加的。
在这种情况下,通过向Map添加优先级,可以确保具有Cookie的请求与Map1匹配。
优先级是必要的,因为最精确的匹配并不总是显而易见的。例如,如果有第三个Map:

Map3

"request" : {
    "url" : "/oauth2/rest/consent",
    "method" : "GET",
    "headers" : {
      "Authorization" : {
        "equalTo" : "Basic dXNlcjpwYXNzd29yZA=="
      }
    },
  }

如果收到的请求具有来自Mapping 1的Cookie和来自Mapping 3的Authorization标头,则无法确定该请求的最精确匹配项。
它们都匹配3个元素。这就是优先级的作用所在。

aiazj4mn

aiazj4mn3#

WireMock支持设置存根优先级。

默认情况下,WireMock将使用最近添加的匹配存根来满足请求。
可以使用atPriority在Java代码中添加优先级:

stubFor(get(urlMatching("/api/.*")).atPriority(5)

或在JSON中添加:

"priority": 1

点击此处阅读更多信息

相关问题