【问题标题】:Test the message returned by an akka actor containing a Try[T]测试由包含 Try[T] 的 akka actor 返回的消息
【发布时间】:2016-11-06 10:59:26
【问题描述】:

我正在开发一个 Akka Actor,它会以 PutAck[Try[String]] 类型的消息进行响应。问题不在于如何开发actor本身,而在于单元测试。

鉴于以下演员代码

private def put(store: Map[String, Array[Byte]], key: String, value: Array[Byte]) = {
  try {
    val newStore = store + (Objects.requireNonNull(key) -> value)
    sender ! PutAck(Success(key))
    context.become(nonEmptyMap(newStore))
  } catch {
    case ex: Exception =>
      sender ! PutAck(Failure(ex))
  }
}

我希望通过以下测试对其进行测试

"A Storekeeper actor" must {
  "receive an error message for a couple (null, value)" in {
    val sk = TestActorRef[Storekeeper]
    sk ! Put(null, SerializationUtils.serialize(42))
    expectMsg(PutAck(Failure(new NullPointerException())))
  }
}

不幸的是,测试失败并显示消息

assertion failed: expected PutAck(Failure(java.lang.NullPointerException)), found PutAck(Failure(java.lang.NullPointerException))

我认为失败是由于两个异常具有不同的hashCode。

我该如何测试这个案例?

【问题讨论】:

    标签: scala try-catch akka akka-testkit


    【解决方案1】:

    之所以匹配,是因为NullPointerExceptions 的实例只与它们自己相等,而不是其他看似相同的实例。

    您可以做的是期待消息类型,将响应作为值捕获,然后断言您想要的任何内容,如下所示:

    val ack = expectMsgType[PutAck[Try[String]]]
    ack.value.isFailure should === (true)
    ack.value.failed.get shouldBe a[NullPointerException]
    

    【讨论】:

    • 非常感谢。我在 API 中错过了这个方法 :)
    猜你喜欢
    • 2015-05-29
    • 2013-11-27
    • 1970-01-01
    • 2019-04-29
    • 1970-01-01
    • 2020-05-28
    • 2011-09-06
    • 1970-01-01
    • 2019-02-12
    相关资源
    最近更新 更多