Протестируйте сообщение, возвращаемое актором akka, содержащим Try[T]

Я разрабатываю актора 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 в двух исключениях.

Как я могу проверить этот случай?


person riccardo.cardin    schedule 06.11.2016    source источник


Ответы (1)


Причина совпадения заключается в том, что экземпляры NullPointerException равны только самим себе, а не другим, казалось бы, идентичным экземплярам.

Вместо этого вы можете ожидать сообщения о типе, перехватывать ответ как значение, а затем утверждать о нем все, что хотите, примерно так:

val ack = expectMsgType[PutAck[Try[String]]]
ack.value.isFailure should === (true)
ack.value.failed.get shouldBe a[NullPointerException]
person johanandren    schedule 09.11.2016
comment
Большое спасибо. Я пропустил этот метод в API :) - person riccardo.cardin; 09.11.2016