Akka类型化测试-在不知道消息详细信息的情况下预期消息类型

fdbelqdn  于 2022-11-05  发布在  其他
关注(0)|答案(1)|浏览(193)

假设我有一个Actor(OrderGenerator),它响应传入的消息(GenerateOrder),向另一个Order类型的Actor(OrderProcessor)发送消息。

case class Order(orderId: String, partNumber: String, orderQty: Int) // ...etc.

在OrderGenerator的用于GenerateOrder消息的receiveMessage()方法中,我们创建了一个Order对象。orderId值在此时生成(假设它是一个动态生成的UUID)。然后它将此Order作为消息发送给OrderProcessor Actor。

Behaviors.receiveMessage {
    case GenerateOrder(partNumber: String, orderQty: Int) =>
      val newOrder = Order(orderId=GenerateUUID(), partNumber=partNumber, orderQty=orderQty)
      orderProcessor ! newOrder
      Behaviors.same

好了,现在我想测试一下。

val inbox = TestInbox[Order]()
val TestKit = BehaviorTestKit(OrderGenerator(orderProcessor=inbox.ref))
testKit.run(GenerateOrder(partNo="widgetX", orderQty=5))
inbox.expectMessage(Order( ??????? ))

正如您所看到的,我不知道预期Order的完整细节是什么,因为orderId是由OrderGenerator在运行时生成的,而且我无法预测UUID将是什么。
在不知道详细信息(或仅知道其中一部分)的情况下,如何测试Order消息是否已发送?

jhdbpxl9

jhdbpxl91#

我知道这听起来可能有点“不安全的方法”(虽然我不认为还有其他选择),但是看一下docs of akka TestInbox,您可以使用这两个方法,并使用订单的其他字段作为Assert:

assert(inbox.hasMessages())
val message = inbox.receiveMessage()
assert(message.isInstanceOf[Order]) // or essentially any other comparison, like message.partNo == "widgetX"

相关问题