spring - Wiremock 没有收到任何请求
问题描述
我正在为资源(带有 resteasy 的 Jax-rs)编写集成测试,它调用第三方对 Trustpilot Api 的请求以获取产品的评论链接。在我的测试中,我想使用 Wiremock 模拟这个调用,并使用 resteasy Dispatcher 调用请求。下面的代码显示了我的设置(名称等已更改)。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { MyResourceTestContext.class })
public class MyResourceIntegrationTest {
@Rule
public WireMockRule wireMockRule = new WireMockRule(wireMockConfig().dynamicPort().dynamicHttpsPort());
@Autowired
private MyResource myResource;
private Dispatcher dispatcher;
private MockHttpResponse response;
@Before
public void setUp() throws Exception {
dispatcher = MockDispatcherFactory.createDispatcher();
dispatcher.getRegistry().addSingletonResource(myResource);
response = new MockHttpResponse();
}
@Test
public void testResourceShouldReturnRedirectToTrustpilotreview() throws Exception {
URI apiRequestURI = UriBuilder
.fromUri("https://api.trustpilot.com/v1/private/product-reviews/business-units"
+ "/{businessUnitId}}/invitation-links")
.build(BUSINESS_UNIT_ID);
URI expectedRedirectURI = UriBuilder.fromUri("https://products.trustpilot.com/#evaluate/{reviewLinkId}")
.build(REVIEW_LINK_ID);
stubFor(post(apiRequestURI.toString())
.willReturn(okJson("{\"reviewLinkId\":\"" + REVIEW_LINK_ID + "\","
+ "\"reviewUrl\":\"" + expectedRedirectURI.toString() + "\"}")));
MockHttpRequest request = MockHttpRequest.get("/myResource");
dispatcher.invoke(request, response);
WireMock.verify(1, postRequestedFor(urlEqualTo(apiRequestURI.toString())));
Assert.assertEquals(HttpStatus.TEMPORARY_REDIRECT.value(), response.getStatus());
Assert.assertEquals(expectedRedirectURI.toString(), response.getOutputHeaders().getFirst("Location"));
}
但我得到的是(我在网址中的实际出价):
com.github.tomakehurst.wiremock.client.VerificationException: Expected at least one request matching: {
"url" : "https://api.trustpilot.com/v1/private/product-reviews/business-units/<bid>/invitation-links",
"method" : "POST"
}
Requests received: [ ]
使用调试器进入请求我可以说这个请求和其他请求实际上已成功执行。但它们不被 Wiremock 识别/模拟。
我的 Wiremock 设置有问题吗?有任何想法吗?谢谢!
解决方案
目前没有向 WireMock 发送任何内容的原因有几个:
- WireMock 在存根时只接受相对 URL,因此传递包括协议和域的完整 URL 将不起作用。尝试等效于的东西
stubFor(post(urlPathEqualTo("/v1/private/product-reviews/business-units/<bid>/invitation-links")
。 - 您的被测类似乎没有任何方法可以知道 WireMock 正在哪个主机/端口上运行并且没有设置转发代理,因此代码可能仍在尝试调用真正的 Trustpilot API。
要解决 2. 你有几个选择:
- 设置您的测试类/代码以
localhost
用作目标主机和wireMockRule.port()
端口号的结果,或者wireMockRule.httpsPort()
如果您使用的是 HTTPS。 - 使用新的自动 JVM 代理设置功能通过 WireMock 代理您的应用程序调用。这假设您使用的是 WireMock 2.31.0+ 并且您的应用程序的 HTTP 客户端尊重 JVM 代理系统属性。
推荐阅读
- javascript - 单击其中一个贝宝付款选项时如何显示加载程序
- c - 为什么 explain_fwrite 说我的文件标记为非阻塞?
- scala - Intellij idea 中的默认测试覆盖率工具
- python - Tkinter:为什么子帧没有出现在一个帧中,而是出现在另一个帧中?
- json - 追加到key匹配的json
- angular - Angular - 依赖选择下拉列表不刷新列表中的初始数据
- build.gradle - 我如何在没有互联网访问的情况下手动构建 gradle 项目
- javascript - 当处理器仅在备份时终止时,公牛作业不会停止
- pytorch - 通过torch DataLoader加载微型图像网的问题
- vba - 按编号引用列时避免选择