Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么';在junit中拦截http调用的最简单方法是什么?_Java_Unit Testing_Junit - Fatal编程技术网

Java 什么';在junit中拦截http调用的最简单方法是什么?

Java 什么';在junit中拦截http调用的最简单方法是什么?,java,unit-testing,junit,Java,Unit Testing,Junit,我们有一些测试,我们从shell脚本运行。它们调用系统A,系统A又调用系统B。因此,我们有3个独立的JVM。这些测试完全自动化,在jenkins系统上运行,无需任何人工干预 作为测试的一部分,我想拦截从A到B的调用,并检查有关内容的各种情况。呼叫仍然需要到达B,B的响应需要原封不动地返回给A 系统A的配置告诉它B在哪里。它们都在我的本地机器上运行,因此显而易见的选择是从测试中启动http服务器(可能是jetty),配置A与我的临时服务器通信,然后当我运行测试时,服务器将看到从A发送到B的所有通信

我们有一些测试,我们从shell脚本运行。它们调用系统A,系统A又调用系统B。因此,我们有3个独立的JVM。这些测试完全自动化,在jenkins系统上运行,无需任何人工干预

作为测试的一部分,我想拦截从A到B的调用,并检查有关内容的各种情况。呼叫仍然需要到达B,B的响应需要原封不动地返回给A

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

我曾经使用jetty做过类似的事情。我以前的存根解决方案做了一些非常类似的事情:但它没有将调用代理到另一个系统,而是简单地检查请求并返回一个虚拟响应。我们仅限于使用jetty 6.1-可以使用另一个版本,但使用PITA


我认为码头可能是最好的解决方案。我可以非常简单地通过扩展
AbstractHandler
,然后创建一个新的对SystemB的http调用来完成它。但是这会有点混乱。有没有一种简单、标准的方法可以做到这一点?

最简单的方法就是不要这样做

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

第二,你希望通过这样做得到什么?它将如何提高应用程序的可靠性或质量?很有可能不会,而试图维护设置和额外断言的额外复杂性实际上会降低所有内容的可维护性

下面是我要做的:

  • 对应用程序a和B中的逻辑的各个位编写一系列单元测试。这些测试将单独测试逻辑。(我建议您首先单独执行单元测试,然后当单元测试失败时,您的构建可能会在执行集成和功能测试之前快速失败。集成和功能测试会更慢、更麻烦,因此这会更快地通知您问题。不过,这一点由您决定。)
  • 编写一系列集成或功能测试,检查应用程序B在给定特定输入的情况下是否提供了正确的输出
  • 对a的输入和输出编写一系列集成或功能测试。编写测试时,让它调用真实的B,并假设B按预期工作。如果不是,您的应用程序B测试将发现它,并且您将在应用程序A测试中遇到一些额外的故障,您可以忽略这些故障,直到B得到修复

  • 你不必嘲笑一切。尝试这样做会给你带来更多的麻烦,而不是节省。过于复杂的测试将是一种净损失。

    只是一个术语注释:您在这里描述的不是单元测试。这是一个集成测试。这里是魔鬼代言人,但是你一定要看到“传输中”的请求吗?让一组测试只命中服务B,并确保其响应正确,然后模拟B来测试a,最后端到端地测试整个流程,但使用a的响应来验证B是否正确地完成了其工作,这会更简单吗?这可能需要提前编写更多的代码,但在大多数情况下,我建议测试代码要简单得多,并且更易于维护。它还可能使识别故障原因变得更快更容易。是的,事实上,这些绝对不是单元测试。问题更新。首先是的,你是对的,这些绝对不是单元测试。其次,我实际上想要实现的是确保在某个场景中(基于对a的外部输入),A向B发送某个内容。系统B基本上已经是存根。@mdarwin在应用程序A的测试结束时,通过检查应用程序B的输出或状态,您可以实现同样的功能吗?我们必须修改系统B,以记录A对它说的内容,并编写一个新的API从测试中查询这些内容。所以理论上是的,但实际上不是。@mdarwin一定有副作用或输出,对吗?它在哪里,为什么不能在那里进行测试?因为系统B是一种存根,在系统a和B中除了日志条目之外没有其他内容。我们目前在系统a上查看事务日志文件,但它是间歇性的,因为记录器是异步的(至少我们认为这就是为什么它是间歇性的)。因此,我希望能准确地看到电线上到底发生了什么。