2017-11-16 2 views
1

JUnitTest를 작성하여 Karaf 서버가 올바르게 시작되고 모든 (필요한) 번들이 설치되고 활성화되도록합니다.Karup Startup 용 JUnitTest

나는이 주어진 번들이 주어진 상태에 있음을 보장하는 도우미 메소드 "assertBundleState"를 호출하는 테스트를 가지고있다. 테스트 결과는 다음과 같습니다 :

@Test (timeout=30000L)  
public void testBundlesStarted() throws Exception { 
    assertBundleState("bundle.Name", BundleLifecycleState.Active); 
... <other bundles in similar way> 
} 

이것은 과거에는 문제가 없었습니다. 타임 아웃에 도달하지 못했습니다.

불행히도 이제 시작을 위해 조금 더 오래 필요로하는 번들을로드해야합니다. 테스트가 실행될 때 번들이 아직 시작되지 않았습니다. 그래서 테스트가 실패합니다.

BeforeClass 메서드에서 수면을 시도했지만이 솔루션에 만족하지 않습니다. 왜냐하면 주어진 수면 시간이 매 시간마다 모든 기계에 충분하다는 것을 보장 할 수 없기 때문입니다. 그래서 Karaf와 상호 작용할 수있는 이벤트 기반 솔루션을 찾고 있습니다.

@BeforeClass 
public static void init() throws Exception { 
    Thread.sleep(120000L); 
} 

아무도 내가 더 나은 방법으로 어떻게 해결할 수 있을지 생각하지 못합니까? 감사합니다.

답변

1

assertBundleState은 Karaf 서버가 시작되었고 '준비가되었는지'를 성공적으로 판단 할 수 있습니다. 그러나 문제는 이것을 점검하기 전에 얼마나 오래 기다릴 지 모른다는 것입니다. 충분히 오랫동안 기다리지 않으면 오탐을 할 수 있습니다. 너무 오래 기다리면 빌드 경과 시간이 잘못 연장됩니다.

카라프 서버가 '준비가되었을 때'호출 할 일종의 청취자 또는 콜백 훅을 등록 할 수 없다고 가정합니다. 실제로 이것이 가능하다하더라도 카라프 서버가 시작하지 않는 (즉 리스너를 호출 할 수없는) 실패 사례를 해결해야합니다.

그래서 카라프 서버가 사용 가능하게되고 Thread.sleep 호출의 추악함과 너무 오래 기다리는 잠재적 손실 시간을 숨길 필요가 있다고 생각합니다. 해당 상자에 틱하려면 Awaitility을 사용할 수 있습니다. 예 :

@Test 
public void aTest() { 
    // run your test 

    // this will wait until Karaf is available for at most 10 seconds 
    // and will check every 100ms so if Karaf becomes available earlier 
    // than 10 seconds then the test will complete almost as soon as 
    // it becomes available but if Karaf does not become available 
    // within 10 seconds then the test will fail 
    await().atMost(10, SECONDS).until(karafIsAvailable()); 

    // assert 
    // ... 
} 

private Callable<Boolean> karafIsAvailable() { 
    return new Callable<Boolean>() { 
     public Boolean call() throws Exception { 
      // return true if your condition has been met 
      // e.g. assertBundleState 
      return ...; 
     } 
    }; 
} 
관련 문제