2010-06-24 7 views
13

스칼라 액터가 종료 될 때까지 기다리는 방법()? 단위 테스트에서 두 명의 액터를 설정하고 몇 명의 메시지를 보내서 시작합니다. 그들은 몇 가지 메시지를 앞뒤로 보내고 결국 양쪽 모두 exit()를 호출합니다. 합격하기 전에 두 주체가 끝나기를 기다리는 부대 테스트를 어떻게 만들 수 있습니까?액터가 끝날 때까지 기다리십시오()

답변

7

액터간에 교환 된 메시지의 수를 미리 알고있는 경우 java.util.concurrent.CountDownLatch을 사용하여 메시지 수를 추적 할 수 있습니다. 배우에서, 메시지의 각 처리 후,

latch.countDown() 

하고 주 스레드에서

래치의 카운트 다운 제로로 될 때까지 메인 스레드 대기를 만들 것입니다
latch.await() 

을합니까.

미리 메시지 수를 모르지만 완료를 나타내는 조건이있는 경우 java.util.concurrent.locks.Condition을 사용할 수 있습니다. 당신의 조건이 만족 될 때 배우에서,

if (conditionSatisfied) 
    condition.signal() 

하고 주 스레드에서

이 조건이 만족 될 때까지 그것을 기다릴 수 있도록
while (!conditionSatisfied) 
condition.await() 

을합니까.

자세한 내용은 javadocs CountDownLatchCondition을 참조하십시오.

예를 들어 Condition을 사용하는 this Gist을 참조하십시오.

+1

을 그냥 전에 카운트 다운을() 수 exit()는 1로만 계산됩니다. 두 메소드가 항상 함께 호출되므로 중복되는 것처럼 보입니다. –

+0

나는 그것을 얻지 않는다. 액터가 끝날 때까지 주 스레드가 기다리고 싶습니다. 이것이'await()'호출이하는 일입니다. –

+0

이것은 JUnit 테스트 (액터에서 대기 중)만을 위해 프로덕션 코드 (행위자)에 래치 또는 조건을 추가해야한다는 것을 의미합니다. –

2

사양에서는 Eventually Matchers을 사용할 수 있습니다. 당신은 당신의 배우의 최종 상태 또는 실체를 알고있는 경우 (예를 들어, 지속성 저장소)이 상태로의 전환이 발생할 때까지 기다려야하는 테스트를 강제 할 수 있습니다, 수정 :

<entity state> must eventually(10, 1.second)(be(<state>)) // there will be 10 retires every second, and if the state will be different, exception is thrown 
+1

이렇게하면 단위 테스트를 실행하는 데 약 10 분의 1 초가 걸립니다. 너무 느립니다. –

관련 문제