如何在Akka Actor中模拟HTTP服务

问题描述 投票:2回答:1

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

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

对此有何想法?测试执行IO操作(HTTP调用,写入DB等)的Actor的惯用方式是什么。

PS:我正在使用Akka Typed。

scala unit-testing mocking akka actor
1个回答
1
投票

我个人认为,应尽可能避免在Actor中进行IO操作(请参阅this presentation for more details

话虽这么说,我敢肯定有些人会不同意,您可能不应该听我说:)

这是我要如何对其进行模拟以进行测试。

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

    特征客户{def makeHttpCall(input:Int):Future [Output]}

((您将想要创建实现该特征的某种类,并与演员分开对其进行测试。)

  1. 使用其特征的构造函数/应用方法将该特征的实例传递给您的actor。

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

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

    TestClient类扩展了客户端{def makeHttpCall(input:Int):Future [Output] =Future.successful(Output(...))}

注:我选择的所有类和方法的名称都只是占位符。当然,您应该根据所使用的上下文选择更具体的名称。

© www.soinside.com 2019 - 2024. All rights reserved.