Scala 如何在Akka Actor中模拟HTTP服务

Scala 如何在Akka Actor中模拟HTTP服务,scala,unit-testing,mocking,akka,actor,Scala,Unit Testing,Mocking,Akka,Actor,我有一个actor(实际上是一个持久actor),为了响应消息(命令),它需要进行HTTP调用。现在的问题是如何在单元测试中处理这个HTTP调用 通常,我会在测试时使用DI和模拟的组合来注入HTTP服务的模拟实现。但我不确定这是否是解决阿克卡问题的方法?即使这是如何在Akka中实现它,我也不确定如何在测试中进行注入和模拟 有什么想法吗?测试执行IO操作(HTTP调用、写入DB等)的参与者的惯用方法是什么 PS:我使用的是Akka类型。我个人认为,如果可能的话,应该避免在演员中进行IO操作(请参阅

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

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

有什么想法吗?测试执行IO操作(HTTP调用、写入DB等)的参与者的惯用方法是什么


PS:我使用的是Akka类型。

我个人认为,如果可能的话,应该避免在演员中进行IO操作(请参阅)

话虽如此,我相信有些人会不同意,你可能不应该听我说:)

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

  • 创建一个表示http调用的特征

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

  • (您将希望创建一个实现此特性的类,并将其与参与者分开进行测试。)

  • 使用构造函数/应用方法将该特性的实例传递给参与者

    def应用(客户端:客户端):行为[…]={ //在你的行为中使用你的客户 }

  • 在测试中,创建客户端的模拟实例,并将其传递给参与者。您可以使用模拟库(ScalaMock或Mockito)模拟您的客户机,或者您实际上可以相对轻松地创建trait的测试实现:

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


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

    很抱歉格式化了。。我在手机上,它似乎不想和我合作!谢谢但是我应该提到我使用的是Akka类型(功能性风格),请看:我不知道如何将特性与该风格结合使用,这是一个很好的澄清。在这种情况下,您可以将trait的实现传递到apply方法中,并在那里使用它:def apply(client:client):Behavior[…]。谢谢。这种做法确实可行。你能用输入的Akka API的特定信息更新你的答案吗?所以我可以接受。谢谢你为Akka打过字。希望现在更清楚(再次为糟糕的格式感到抱歉)