什么是从junit中拦截http调用的最简单方法?

时间:2016-01-05 16:06:46

标签: java unit-testing junit

我们有一些测试,我们从shell脚本运行。他们调用系统A,后者又调用系统B.因此,我们有3个独立的JVM。这些测试是完全自动化的,无需人工干预jenkins系统即可运行。

作为测试的一部分,我想截取从A到B的调用并检查有关内容的各种内容。呼叫仍然需要到达B,并且B的响应需要不加改变地返回到A.

系统A具有告诉它B在哪里的配置。它们都在我的本地机器上运行,所以显而易见的选择是在测试中启动一个http服务器(可能是jetty),配置A与我的临时服务器通信,然后当我运行我的测试时,服务器将看到所有流量从A发送到B.然后需要将这些请求传递给B,获取响应,并将该响应返回给A.单元测试然后需要将每个请求的内容看作String,并对其进行一些检查

我过去使用码头做过类似的事情。我之前的存根解决方案做了一些非常相似的事情:但它不是代理调用另一个系统,而是简单地检查了请求并返回了一个虚拟响应。我们被限制使用jetty 6.1 - 使用另一个版本是可行的,但是PITA。

我认为码头可能是最好的解决方案。我可以通过扩展AbstractHandler,然后创建一个新的系统B的http调用来做到这一点。但它会有点混乱。有一种简单,标准的方法吗?

1 个答案:

答案 0 :(得分:5)

最简单的方法是不要。

首先,您所描述的显然不是单元测试。单元测试是一种与应用程序的其余部分隔离测试一小部分代码的测试,更不用说外部资源了。相反,您正在测试整个应用程序,应用程序具有外部依赖性。这很好,但这些测试属于集成或功能测试类别。 (实际上,您可能仍然使用单元测试框架来编写这些类型的测试,但区别很重要。)

其次,你真的希望通过这样做获得什么?如何提高应用程序A的可靠性或质量?它很可能不会,并且尝试维护设置和额外断言的额外复杂性实际上会使所有更少可维护。

所以我会这样做:

  1. 在应用程序A和B中的逻辑的各个位上编写一系列单元测试。这些将单独测试逻辑。 (我建议你先单独执行单元测试,然后在单元测试失败时,你的构建可能会在执行集成和功能测试之前快速失败。集成和功能测试会更慢,更麻烦,所以这会通知你问题更快。在这一点上由你决定。)
  2. 编写一系列集成或功能测试,检查应用程序B在给定特定输入的情况下给出正确的输出。
  3. 在A的输入和输出上写一系列集成或功能测试。在编写它们时,让它只调用真实的B并假设B按预期工作。如果不是,您的应用程序B测试将接收它,并且您将在应用程序中出现一些额外的故障A测试,您可以忽略直到B被修复。
  4. 你不必嘲笑一切。试图这样做会比你节省更多的麻烦。过于复杂的测试将是净损失。