Tôi đã sau:Akka kiểm tra giám sát xử lý lỗi
class Supervisor(dataProvider: DatabaseClientProvider) extends Actor {
val writer = context.actorOf(Props(classOf[Child], dataProvider.get))
def receive: Receive = {
case Msg => writer forward msg
}
override val supervisorStrategy = OneForOneStrategy(maxNrOfRetries = 100) {
case e: ConnectionException => Resume
}
}
class Child(db: DatabaseClient) extends Actor {
def receive: Receive = {
case msg:Msg => db.write(text)
}
}
Tôi muốn kiểm tra đơn vị mã ở trên về cơ bản tôi đang cố gắng để đảm bảo khi ngoại lệ xảy ra, chúng tôi vẫn đang nối lại quá trình xử lý như bạn có thể xem dưới đây. Vấn đề là không có ngoại lệ bị bắt bởi người giám sát. Cách tốt nhất để kiểm tra mã dưới đây là gì?
"resume handling messages when exception occurs" in {
// Given
val msg1 = Msg("Some msg1")
val msg2 = Msg("Some msg2")
//Throw an exception when attempting to write msg1
val databaseClient = mock[DatabaseClient]
when(databaseClient.write(msg1.text).thenThrow(ConnectionException("Error!"))
val dataProvider = mock[DatabaseClientProvider]
when(dataProvider.get).thenReturn(databaseClient)
val supervisor = system.actorOf(Props(new Supervisor(dataProvider)))
// When
intercept[ConnectionException] {
supervisor ! msg1
}
// When
supervisor ! msg2
// Then
verify(databaseClient.write("Some msg"), times(2))
}
Tôi hy vọng AKKA đặt tên cho những phương pháp đó theo cách trực quan hơn! – Mayumi
"người quyết định" là mơ hồ nhưng tôi không thấy họ thay đổi tên (phá vỡ khả năng tương thích ngược) vì lợi ích của một thay đổi dễ đọc nhỏ. Oh well –