0

type のメッセージで応答する 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失敗は、2つの例外の違いによるものだと思いました。

このケースをテストするにはどうすればよいですか?

4

1 に答える 1

1

一致する理由は、NullPointerExceptions のインスタンスはそれ自体とのみ等しく、他の一見同一のインスタンスとは等しくないためです。

代わりにできることは、メッセージをタイプで期待し、応答を値としてキャッチし、それについて必要なものを何でもアサートすることです。次のようになります。

val ack = expectMsgType[PutAck[Try[String]]]
ack.value.isFailure should === (true)
ack.value.failed.get shouldBe a[NullPointerException]
于 2016-11-09T13:14:04.550 に答える