【问题标题】:How to mock webservices reponses in a maven application?如何在 Maven 应用程序中模拟 Web 服务响应?
【发布时间】:2014-04-01 14:11:03
【问题描述】:

我的应用程序使用外部第三方 Web 服务(我为此成功使用了 cxf)。 我如何使用本地文件模拟这个网络服务来构建预先保存的响应(用于测试目的)?

更具体地说:

我正在考虑使用 2 个 maven 项目:dao-wsdao-ws-mock,它们都有相同的界面。

第一个 dao-ws 真正使用 cxf 调用 web 服务,而第二个 dao-ws-mock 使用本地文件构建预先保存的响应(用于测试目的)。

mvn install 构建 webapp 项目,而 mvn install -DuseMock 构建带有 dao-ws-mock 依赖项的 webapp 项目。 这是正确的方法吗?有更好/更简单的方法吗?

根据使用的属性,我将生成相同的.war,但行为不同。这听起来对我来说是一个不好的做法(例如,我不想在我们内部的 Nexus 上使用模拟依赖来推动战争)。 你怎么看?

最好的问候,

【问题讨论】:

  • 让我明白这一点。您想要测试将部署为战争的应用程序,并且您正在考虑创建一个不同的战争来进行集成测试?对我来说,这似乎有些可疑。测试你不会部署的战争,所以你可以编写一些测试 - 猜猜它可以在紧要关头工作,但对我来说似乎并不完全有效。
  • 不完全是:第三方webservice并不总是一致的(在我的例子中,返回的数据量可能会改变,所以测试的结果会改变)。我需要模拟 web 服务,以确保第三方返回的数据对于我的测试来说始终是相同的。
  • 就我个人而言,我并不热衷于编写集成测试,但在我看来,这仍然是您所描述的。你能不能只编写单元测试来模拟你所依赖的 Web 服务,并在你使用该 Web 服务的地方测试你的类?如果你这样做了,你的测试代码很容易不会与你的战争一起部署。您的单元测试可以轻松读取您想要替换实际 Web 服务结果的任何文件。我喜欢 Mockito 或 JMockit——你都熟悉吗?

标签: java spring unit-testing maven mocking


【解决方案1】:

您可以使用 SoapUI 的内置模拟服务 - http://www.soapui.org/Getting-Started/mock-services.html

您可以基于 wsdl 生成模拟服务,指定默认响应,甚至可以创建根据请求返回不同响应的动态响应。

然后您可以将模拟服务构建到 .war 中并部署它们:http://www.soapui.org/Service-Mocking/deploying-mock-services-as-war-files.html(此链接显示如何在 GUI 中执行此操作,但也可以使用 maven 完成)

【讨论】:

  • 我以前见过 SoapUI,但问题是模拟服务器将是一个独立的服务器,我需要在测试之前启动它。如何使用经典的 mvn test 启动这样的模拟服务器?
  • 看看 maven 生命周期 (maven.apache.org/guides/introduction/…)。您可以在不同阶段运行不同的目标。这是另一个解释如何使用它们的问题 - stackoverflow.com/questions/14771668/…
  • 也许你正在寻找 mvn integration-test
【解决方案2】:

您可以使用Sandbox - 托管模拟服务并且始终可用,因此在运行测试之前无需启动另一台服务器(免责声明:我是创始人)。

您可以根据服务规范(wsdl、Apiary、Swagger)生成模拟,并根据需要添加动态行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 2020-12-10
    • 2012-01-06
    • 1970-01-01
    相关资源
    最近更新 更多