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

Wiremck:对同一个URL和内容的多个响应?

莫逸仙
2023-03-14

这里也分享一下:https://github.com/tomakehurst/wiremock/issues/625

我正在编写一个集成测试,以验证与 REST API 交互的应用程序是否正确处理了不成功的请求。为此,我想模拟一个场景,其中 GET 请求对 HTTP 终结点发出两次。第一次,请求不成功,响应状态代码为500;第二次,请求成功,响应状态代码为 200。

请考虑以下示例:

@Rule
public WireMockRule wireMockRule 
        = new WireMockRule(wireMockConfig().dynamicPort().dynamicHttpsPort());

@Test
public void testRetryScenario(){

    // First StubMapping
    stubFor(get(urlEqualTo("/my/resource"))
            .withHeader("Accept", equalTo("text/xml"))
            .willReturn(aResponse()
                .withStatus(500) // request unsuccessful with status code 500
                .withHeader("Content-Type", "text/xml")
                .withBody("<response>Some content</response>")));

    // Second StubMapping
    stubFor(get(urlEqualTo("/my/resource"))
            .withHeader("Accept", equalTo("text/xml"))
            .willReturn(aResponse()
                .withStatus(200)  // request successful with status code 200
                .withHeader("Content-Type", "text/xml")
                .withBody("<response>Some content</response>")));

    //Method under test that makes calls to endpoint
    doSomething();

    Thread.sleep(5000);

    //Verify GET request was made again after first attempt
    verify(exactly(2), getRequestedFor(urlEqualTo("/my/resource")));

}

有没有办法避免第二个存根映射覆盖第一个存根映射 - 确保第一次 doSomething() 发出请求时,返回状态代码为 500 的响应,第二次返回状态代码为 200 的不同响应?

共有2个答案

姜弘化
2023-03-14

使用场景功能,这样的事情有所帮助:

// First StubMapping
stubFor(get(urlEqualTo("/my/resource"))
        .withHeader("Accept", equalTo("text/xml"))
        .inScenario("Retry Scenario")
        .whenScenarioStateIs(STARTED)
        .willReturn(aResponse()
            .withStatus(500) // request unsuccessful with status code 500
            .withHeader("Content-Type", "text/xml")
            .withBody("<response>Some content</response>"))
        .willSetStateTo("Cause Success")));

// Second StubMapping
stubFor(get(urlEqualTo("/my/resource"))
        .withHeader("Accept", equalTo("text/xml"))
        .inScenario("Retry Scenario")
        .whenScenarioStateIs("Cause Success")
        .willReturn(aResponse()
            .withStatus(200)  // request successful with status code 200
            .withHeader("Content-Type", "text/xml")
            .withBody("<response>Some content</response>")));
甄德寿
2023-03-14

这就是场景特性的用途。

您需要将两个存根放入一个场景(即相同的场景名称),使第一个存根触发到新状态的转换,然后使第二个存根依赖于处于第二状态的场景,第一个存根依赖于处于< code>STARTED状态的场景。

请参见:http://wiremock.org/docs/stateful-behaviour/

 类似资料:
  • 我试图将多个存根组合到一个JSON文件中。 我已经准备好阅读这篇文章:加载wiremock存根文件和这篇文章https://github.com/tomakehurst/wiremock/issues/987https://github.com/tomakehurst/wiremock/issues/987 但我还是做不到。 目前,我有以下课程: 在我的文件夹中,我有: 具有不同存根的文件夹 我想

  • 我正在尝试编写一个简单的应用程序,其中包含一个跟踪每个用户支付的款项的表和一个包含每个用户支付的总金额(所有付款的总和)的第二个表。目前,两个表都有相同的字段(firstName、lastName、金额),我已经将它们从同一个Java类映射到多个表,我无法将该类映射到多个表。对此有什么简单的解决方案吗?

  • 问题内容: var arrObj = [{a:1, b:2},{c:3, d:4},{e:5, f:6}]; 如何将其合并为一个obj? 问题答案: 如果您的环境支持,那么您可以像这样简洁地进行操作 ES5解决方案: 您可以使用这样的 此解决方案仅将的所有键及其值收集在中的每个对象中,最终将结果返回给我们。 这张支票 有必要确保我们在结果中不包括所有继承的可枚举属性。

  • 我对TaskStackBuilder和用于通知的不同挂起内容的组合有问题。让我解释一下是关于什么的。 我有一个IntentService,它会在出现问题时发出通知。有时它会创建几个独立的通知。为什么我不像谷歌说的那样合并通知?因为每个通知都应该打开相同的活动,但在传递的意图中有不同的额外内容。所以,下面是一个学生应该做的: 用额外的东西创造新的意图: 现在是棘手的部分——我想用适当的后堆栈打开It

  • 我有两个这样的等级: 和 我想使用hibernate持久化这两个类。字段messagesOfTypeA、messagesOfTypeB和messagesOfTypeC根据消息中的类型字段对消息对象进行分组。 如何使用XML hibernate映射映射MyClass和Message之间的一对多关系?(我正在使用Hibernate 3.6)

  • 我有上面的编码来提取使用硒 - 蟒蛇的href链接。我想提取每个人的个人资料“董事会成员”中的内容。我知道如何逐个提取它们,但不知道如何编写循环来执行此操作。 以下是我的代码: 任何想法都很感谢!