对于Java测试,我应该模拟客户端还是模拟服务器

时间:2018-10-06 11:29:35

标签: java unit-testing mocking integration-testing

在客户机-服务器体系结构中,当一个人应该模拟客户端并且什么时候应该模拟服务器时,最好的方法应该是什么。我知道单元测试应该只测试给定的类,并且模拟每个依赖对象,而集成测试应该测试整个功能。当涉及到API调用时,我不知道应该模拟用于api调用的客户端,还是应该使用某些服务器模拟框架并让真正的客户端调用模拟服务器。

我遇到一种情况,我应该(不是强制性的)测试是否按正确的API URL,正确的方法以及在查询参数或请求正文中传递的某些值。使用客户端模拟,我可以简单地“验证”是否通过了给定的参数(路径,方法,请求主体),并认为测试成功。如果要模拟服务器,则需要在模拟服务器上创建一些处理过程,以检查路径,方法和请求主体是否正确传递并返回值。在这种情况下,服务器响应是我可以用来衡量测试是否成功的唯一方法(如果未收到所需数据,则发送500)。

根据您的经验,在客户端-服务器体系结构中测试呼叫以进行集成测试的正确方法是什么?如果我们按书进行,那么应该使用服务器模拟,但是在上述情况下可行吗?对于单元测试,很明显应该使用模拟。

更新:为避免混淆:我正在制作一个依赖于我无法控制的公开可用服务的客户端。因此,我正在测试客户端是否正常工作,并且重点放在客户端上。问题是相关的,我应该(在集成测试中)模拟负责远程连接的客户端对象(在我的情况下是Play框架的WSClient),还是应该使用某些服务器模拟(例如okhttp模拟Web服务器)。

另一项更新:大多数人建议遵循简单的经验法则:如果这些是单元测试,则模拟客户端,如果这些是集成测试,则使用模拟服务器。现在,我对此情况感到好奇:我有一个依赖于类B的类A,而类B的客户端对象负责远程调用。如果要为A类编写单元测试,则应该模拟B类,这很好。但是,如果我正在对类A进行集成测试,则可以在类B中模拟客户端对象,并在向其传递适当的参数(路径,方法和请求主体)的情况下“验证”,或者出于完整性考虑,即使模拟客户端对象更容易,我也应该运行模拟服务器。在这种情况下,我将不会测试超时和低级网络错误。或者,在这种情况下,集成测试的重点也应该是测试网络连接。

1 个答案:

答案 0 :(得分:3)

您需要:

  1. 集成测试-使用Wiremock之类的存根服务器,测试超时,畸形响应,500等真实情况。
  2. 测试您的客户端类-使用Mockito模拟服务器端点并验证响应