测试包含Try [T]的akka​​ actor返回的消息

时间:2016-11-06 10:59:26

标签: scala try-catch akka akka-testkit

我正在开发一个Akka演员,它会回复PutAck[Try[String]]类型的消息。问题不在于如何发展演员本身,而是单元测试。

鉴于以下演员代码

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不同。

我该如何测试这个案例?

1 个答案:

答案 0 :(得分:1)

它匹配的原因是NullPointerException s的实例仅等于它们自己,而不是其他看似相同的实例。

你可以做的是期望消息在类型上,将响应作为一个值捕获,然后断言你想要的任何东西,如下所示:

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