在集成测试 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 项目中的集成测试?

在 Java Play 2.4 中测试具有模拟依赖项的控制器

Play 2.4.x - 资产复制

在集成测试中覆盖 bean

Play Framework [2.4.x] 如何在子模块的路由文件中处理公共资产