JUnitTest for Karaf Startup



我想写一个JUnitTest,它确保我的Karaf服务器启动正常,并且所有(需要的(捆绑包都已安装并处于活动状态。

为此,我有一个测试,调用一个辅助方法"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);
}

有人知道我如何以更好的方式解决它吗?谢谢

听起来assertBundleState可以成功确定 Karaf 服务器是否已启动并"准备就绪"。但问题是你不知道在检查之前要等多久;如果您等待的时间不够长,则可能会出现漏报,如果等待时间过长,则构建经过的时间会错误地延长。

我认为您无法注册某种侦听器或回调钩子,Karaf 服务器将在"准备就绪"时调用这些钩子。事实上,即使这是可能的,你仍然必须满足失败的情况,即 Karaf 服务器不启动(因此永远无法调用侦听器(。

因此,我认为您只需要等待 Karaf 服务器可用并隐藏Thread.sleep呼叫的丑陋以及等待太久可能浪费的时间。您可以使用等待来勾选这些框。例如:

@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 ...;
        }
    };
}

相关内容

  • 没有找到相关文章

最新更新