如何在 Akka Actor 中模拟 HTTP 服务

How to mock HTTP service within Akka Actor

我有一个演员(实际上是一个持久演员),为了响应消息(命令),需要进行 HTTP 调用。现在的问题是如何在单元测试中处理这个 HTTP 调用?

通常我会在测试时结合使用 DI 和模拟来注入 HTTP 服务的模拟实现。但我不确定这是否是解决 Akka 问题的方法?即使这是在 Akka 中处理它的方法,我也不确定如何在测试中进行注入和模拟。

对此有什么想法吗?测试执行 IO 操作(HTTP 调用、写入数据库等)的 Actors 的惯用方法是什么。

PS:我正在使用 Akka Typed。

我个人认为,您应该尽可能避免在 Actors 中进行 IO 操作(参见 this presentation for more details)。

话虽如此,我敢肯定有人会不同意,你可能不应该听我说:)

下面是我将如何模拟它进行测试。

  1. 创建一个代表您的 http 调用的特征。

    特质客户{ def makeHttpCall(输入:Int):未来[输出] }

(您需要创建某种实现此特征的 class 并与您的 actor 分开测试。)

  1. 使用其 constructor/apply 方法将该特征的实例传递给您的 actor。

    def apply(client: Client): 行为[...] = { // 在你的行为中使用你的客户端 }

  2. 在您的测试中创建一个 Client 的模拟实例并将其传递给您的 actor。您可以使用模拟库(ScalaMock 或 Mockito)模拟您的客户端,或者您实际上可以相对轻松地创建特征的测试实现:

    class TestClient 扩展客户端 { def makeHttpCall(输入:Int):未来[输出] = Future.successful(输出(...)) }

注意:我选择的 classes 和方法的所有名称都只是占位符。当然,您应该根据工作环境选择更具体的名称。