如何使用 Mockito 进行系统测试?我们应该吗?

How to system test with Mockito? Should we?

我的项目包括各种使用第三方 API 的 spring 引导 @Service

我们为每个这样的服务编写了一个模拟的 class 并且我们 运行 系统测试的方式是 Spring Boot 选择模拟的 classes 而不是比真实的(使用@Profile("test"))。

这样做的动机是:

  1. 仅测试逻辑(即使这可以通过单元测试完成)
  2. 凭经验测试系统是线程安全的
  3. 我们不能广泛使用我们的 API(速率限制),但我们希望 运行 我们的系统处理足够多的项目。

我的问题:

  1. 您会提倡这种方法进行系统测试吗? (所有组件都被模拟)
  2. 如果是这样,像 Mockito 这样的模拟框架可以做到吗? Mockito 的全部意义在于 而不是 自己编写模拟的 classes,但是对于一个服务被多个 bean 使用的系统测试如何完成呢?

通过模拟对外部服务的调用,这是对服务进行单元测试的好方法。您可能希望将测试分成 unit 测试和 integration 测试。通常,单元测试通过使用存根 类 和 @Profile 来模拟任何外部服务调用(正如您所做的那样),或者通过使用像 mockito 这样的模拟库来模拟任何外部服务调用,然后模拟 return 的值服务。

在集成测试中,这将是一个更好的系统测试,您将使用通过 Controller 或模拟库(即 WireMock)提供的存根文件,"mocks"外部服务。如果您的外部 API returns JSON,您可以让 Controller 或模拟库提供实际的 JSON 响应。通过这样做,您正在测试您的服务是否确实进行了 API 调用并对存根结果进行处理。您的服务不会调用实际的 API URL,而是让它调用您的控制器或 WireMock URL。