2017-11-16 9 views
1

私のKarafサーバーが正常に起動し、すべての(必要な)バンドルがインストールされアクティブであることを保証するJUnitTestを作成したいと思います。JUnitTest for Karaf Startup

私は、特定のバンドルが指定された状態にあることを保証するヘルパーメソッド "assertBundleState"を呼び出すTestを持っています。テストは次のようになります。

@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サーバーが起動していて、「準備ができていますか」を確認できます。しかし、問題は、これを確認するまでどれくらい待つか分からないことです。十分に長く待たずに偽陰性を発症した場合、時間が長すぎるとビルド経過時間が間違って長くなります。

私は、Karafサーバーが「準備ができている」ときに呼び出す何らかの種類のリスナーまたはコールバックフックを登録できないと思います。確かに、たとえそれが可能であったとしても、失敗の場合、つまりKarafサーバーが起動しない(したがってリスナーを呼び出すことはできない)場合に対応する必要があります。

私は、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 ...; 
     } 
    }; 
} 
関連する問題