2016-11-06 5 views
0

Я разрабатываю актера Akka, который отвечает сообщением типа PutAck[Try[String]]. Проблема заключается не в том, как развивать самого актера, а в модульных тестах.Проверьте сообщение, возвращенное аккордом akka, содержащим Try [T]

Учитывая, что следующий код актер

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

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

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

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

большое спасибо. Я пропустил этот метод в API :) –

 Смежные вопросы

  • Нет связанных вопросов^_^