2011-08-07 11 views
1

새 메시지 Actor이 예상치 못한 메시지를 처리하는 방법을 테스트하고 있습니다. 이 경우에는 GibberishException을 던집니다. 다음은 테스트 지금까지 구현의 :Akka 관리자로부터 예외 세부 정보를 얻으려면 어떻게해야합니까?

테스트 :

"""throw a GibberishException for unrecognized messages""" in { 
    //define a service that creates gibberish-speaking repositories 
    val stubs = new svcStub(
    actorOf(new Actor{ 
     def receive = { case _ => { 
      self.channel ! "you're savage with the cabbage" 
     } 
     } 
    }) 
) 
    val model = actorOf(new HomeModel(stubs.svc,stubs.store)) 
    val supervisor = Supervisor(
    SupervisorConfig(
     OneForOneStrategy(List(classOf[Exception]), 3, 1000), 
     Supervise(model,Permanent) :: Nil 
    ) 
) 
    try{ 
    intercept[GibberishException] { 
     supervisor.start 
     model !! "plan" 
    } 
    } finally { 
    supervisor.shutdown 
    } 
    stubs.store.plan should equal (null) 
    stubs.svcIsOpen should be (false) 
} 

구현 : 나는 테스트를 실행할 때

class HomeModel(service: PlanService, store: HomeStore) 
extends Actor { 
    private val loaderRepo = service.getRepo() 
    private var view: Channel[Any] = null 

    override def postStop() = { 
    service.close() 
    } 

    def receive = { 
    case "plan" => { 
     view=self.channel 
     loaderRepo ! LoadRequest() 
    } 
    case p: Plan => { 
     store.plan=p 
     view ! store.plan 
    } 
    case _ => throw new GibberishException(_) 
    } 
} 

그러나, 예외 사항, 나는 설립 Supervisor에 도착하지만, 나는 그들과 함께 무엇을 할 것인지 (그것들을 기록하거나 그들의 유형을 시험하는 것과 같이) 어떻게해야할지 모른다. 나는 감독관에게서 예외적 인 세부 사항을 얻을 수 있기를 원한다. 그래서 나는 시험에서 그들을 다시 가로 채고 가로 챌 수있다. 테스트 메소드 밖에서, 실행중인 앱의 UI에서 예외의 성격을보고 싶다면이 기능이 유용하다고 상상해 볼 수 있습니다. 그것이 발생하면 Supervisor에서 이것을 얻을 수있는 방법이 있습니까?

답변

3

GibberishException 만 처리하도록 OneForOneStrategy를 변경하십시오. 해결해야합니다.

+0

하지만 관리자에게 예외를 기록하거나 달리 행동을 취하는 방법은 무엇입니까? 거기에 오류 처리 코드를 추가 할 수있는 고리가 어디에 있는지 알지 못합니다. 배우가 다시 시작된다는 것을 이해합니다. 그러나 예외를 기록하거나 사용자에게 메시지를 표시하는 것보다 더 많은 것을하고 싶다면 어떻게해야합니까? – traffichazard

+0

예외가 이미 Akka에 의해 기록됩니다. 사용자에게 메시지를 보내려면 !!! 대신에 ! 그리고 당신은 미래에 예외를 가질 것입니다. –

+0

GibberishException 만 처리하고 !! 테스트와 함께'intercept' 블록에 !!! 그 다음에 'get'을하면 그 결과는 나에게 똑같은 결과를 준다. 'GibberishException'은 잡히지 않고 내 커맨드 라인으로 덤핑되고, ScalaTest는'Expected exception org.thimblus.model.GibberishException이 던져 지지만 akka.dispatch.FutureTimeoutException이 던져졌습니다. '라는 테스트에서 실패합니다. 예외가있는 것처럼 보입니다. 테스트가 기다리는 스레드와는 다른 스레드에 던져진다. – traffichazard

관련 문제