【问题标题】:Unit testing web service calls单元测试 Web 服务调用
【发布时间】:2011-12-16 19:03:48
【问题描述】:

我正在开发一个 Java 项目,该项目分为 Web 项目和后端项目。 Web 通过 Web 服务调用与后端对话。

Web 项目中有一个类可以进行所有 Web 服务调用,我想围绕该类添加测试。我想做单元测试,而不是功能测试,所以我不想让 Web 服务实际运行来运行测试。如果这个类只是将调用传递到后端,我可能愿意忽略对其进行测试,但是此时正在发生缓存,所以我想测试它是否正常工作。

当生成 web 服务时,jax-ws wsgen 它会创建一个前端使用的接口。我已经使用这个生成的接口来创建一个用于测试的假对象。这很有效,但这种方法存在问题。

目前我是团队中唯一一个进行单元测试的人,也是唯一一个维护测试代码的人。我希望能够在构建其余代码时构建测试代码,但是如果其他人在其中一个 Web 服务类中引入了新方法,那么接口上就会有新方法,并且我的假对象不会实现它,因此会被破坏。

Web 和后端代码项目不相互依赖,我不想在它们之间引入依赖关系。因此,在 Web 服务端点之上引入一个接口似乎不太合理,因为如果我把它放在后端,我的 Web 代码需要引用它,如果我把它放在前端,我的后端代码需要引用它。我也无法扩展端点,因为这也会在项目之间引入依赖关系。

我不熟悉 Web 服务的工作原理,以及如何为 Web 项目生成类以便能够引用它们。所以,我不知道如何在后端创建一个可供我在 Web 项目中使用的界面。

所以,我的问题是,如何在不引入项目依赖项(在 Eclipse 构建路径中)的情况下让前端项目可用的接口?或者,还有其他更好的方法来伪造我正在调用的后端 Web 服务吗?

【问题讨论】:

  • 我觉得你需要找mock-ups (Mockito, JMockIt) 我没有用太多所以无法给出完整的答案。
  • 我没有使用任何库来进行模拟。我通常是手动模拟的(因为它非常简单,并且让我可以更好地控制我的模拟或假对象)。由于我是唯一一个进行单元测试并试图让办公室接受它的开发人员,我宁愿让事情尽可能简单。
  • 我同意使用 Mocking 框架的建议。 @Beckyreamy - 这实际上让生活比手动模拟简单得多。如果您有 20 个方法接口,但只想测试一种方法,那么您只需实现该方法即可。另外,这解决了原始帖子中关于添加接口的问题。如果接口被扩展,模拟框架会为你处理这个。如果您手动模拟,则可能会出现编译错误(除非您记得在另一个项目中更新手动模拟)。我已经使用了很多 Mockito,它极大地简化了我的测试。
  • 感谢您的反馈。我可能需要调查一些框架
  • 看看这个框架code.google.com/p/smock

标签: java web-services unit-testing junit


【解决方案1】:

首先,我将缓存代码分解为一个不直接依赖于 Web 服务调用的可测试单元。

对于 Web 服务,我发现同时拥有运行 Web 服务的功能测试和模拟 Web 服务的其他测试很有用。功能测试可以帮助您找到模拟可能遗漏的边缘案例。

例如,我正在使用 Axis2 并从 WSDL 生成存根。对于模拟,我只是实现或扩展生成的存根。在我们的例子中,真正的 Web 服务是由外部组织实现的。通过探索性功能测试探索他们的 Web 服务,发现了一些需要处理的异常,而这些异常仅通过检查生成的存根并不明显。我使用这些信息来更好地模拟这些边缘情况。

【讨论】:

  • 我很想进入并将缓存拉出到一组单独的类中。这是我对代码的改进清单,但是,由于我对这家公司还很陌生,所以我在进行这样的重大更改时遇到了一些阻力。
  • 至于添加功能测试,我也想做。我只是还没接触到那部分。当我向公司介绍整个自动化测试时,我试图放慢一点,以免将单元测试的概念与功能测试混淆。
  • 我不会请求许可来使代码更具可测试性。这是我职业责任的一部分。
  • Paul,我同意改进我正在处理的代码是我职业责任的一部分。这就是我向公司介绍自动化测试的原因。但是,该责任的一部分是考虑团队中的其他开发人员。他们不熟悉测试以及我想介绍的一些模式,因此我没有尝试进行很多大的更改,而是尝试逐步改进代码。
猜你喜欢
  • 2011-02-03
  • 1970-01-01
  • 2011-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-04
  • 1970-01-01
  • 2015-09-17
相关资源
最近更新 更多