在集成测试 Play 2.4.X 中模拟外部 Web 服务调用
Posted
技术标签:
【中文标题】在集成测试 Play 2.4.X 中模拟外部 Web 服务调用【英文标题】:Mock external web service calls in integration testing Play 2.4.X 【发布时间】:2016-04-11 13:12:03 【问题描述】:我正在使用微服务,我想为它编写集成测试。 我的微服务在端口号上运行。 9000, 9001。所以我想测试我的端口 9000 的路由,但它在内部调用我在 9001 上运行的服务,所以我收到连接拒绝错误,我想模拟命中 9001 的特定调用。 我试过play-mockws和wiremock。
【问题讨论】:
【参考方案1】:看看rest-client-driver - 这让您可以模拟可以通过 HTTP 调用的外部服务。
添加依赖:
libraryDependencies += "com.github.rest-driver" % "rest-client-driver" % "1.1.44
将以下内容添加到您的测试类中。
@org.junit.Rule
public ClientDriverRule clientDriver = new ClientDriverRule(9001);
对于每个测试方法,您可以在 clientDriver
上设置预期 - @Rule
注释负责在测试之间重置客户端驱动程序。
@Test
public void testFoo()
clientDriver.addExpectation(onRequestTo("/service/echo")
.withMethod(Method.POST)
.withBody("foo",
"text/plain"),
giveResponse("bar"));
// ...the rest of your test
【讨论】:
我收到了这个“意外请求:”错误,我猜是因为它要求我构建完全相同的请求。 (例如标题,内容类型,连接:“keep-alive”,用户代理:“AHC/1.0”,接受:“/”)ClientDriverRequest
遵循构建器模式,因此您只需编写一种方法来应用请求的所有样板,然后在测试方法中添加细节。
您能否提供任何参考,例如如何减少请求中不需要的数据?
该数据将出现在您的实际应用程序中,因此您应该在必要时尝试在测试中对其进行建模。设置断点以从请求中提取所有数据,并使用它来配置您的测试。
我尝试通过 java Map 构造请求,例如设置标头,但实际请求和我在测试用例中创建的请求与实际请求中的连接不同:Keep-alive 但在我的测试用例就像这样的连接:“keep-alive”。两者都有“”差异。我想这就是为什么我无法嘲笑它。以上是关于在集成测试 Play 2.4.X 中模拟外部 Web 服务调用的主要内容,如果未能解决你的问题,请参考以下文章
迁移到 2.4.x (Java) 后在 Play Framework 中运行测试时出错
为啥在使用“sbt it:test”时不执行 Play/Scala 项目中的集成测试?