java - Karaf Startup 的 JUnitTest

标签 java testing junit apache-karaf smoke-testing

我想编写一个 JUnitTest,它可以确保我的 Karaf 服务器正常启动并且所有(需要的)Bundle 都已安装并处于 Activity 状态。

为此我有一个测试,调用一个辅助方法“assertBundleState”来确保给定的 Bundle 处于给定的状态。测试如下所示:

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

这在过去工作得很好。从未达到超时。

不幸的是,我现在必须加载一个包,这需要更长的时间才能启动。因此,在执行测试时,Bundles 尚未启动。因此测试失败。

我已经在 BeforeClass 方法中尝试过 sleep ,但我对这个解决方案并不是很满意。因为我不能确保给定的 sleep 时间在每台机器上每次都足够。所以我正在寻找一些基于事件的解决方案来与 Karaf 交互。

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

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

最佳答案

听起来 assertBundleState 可以成功确定 Karaf 服务器是否已启动并“准备就绪”。但问题是你不知道要等多久才能检查这个;如果您等待的时间不够长,就会有漏报的风险;如果等待的时间过长,那么您的构建运行时间就会被错误地延长。

我假设您无法注册某种监听器或回调 Hook ,Karaf 服务器将在“准备就绪”时调用这些 Hook 。事实上,即使那是可能的,您仍然必须应对失败情况,即 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 ...;
        }
    };
}

关于java - Karaf Startup 的 JUnitTest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47323120/

相关文章:

java - Java如何在RAM中存储原始类型? [复制]

xml - 发布 DTD/XXE XML 时测试 Scala Play 行为

java - 如何在java程序中运行外部测试用例(Class,junit)?

java - Mockito 错误 : However, 与此模拟进行了 1 次交互

java - SpEL 函数更改字符串

javascript - Firestore 订购限制

java - 我可以使用 Ear 部署数据源及其相应的驱动程序吗?

java - 测试 REST Web 服务

ruby - 如何 stub 方法调用,然后进行哈希查找?

java - 导入无法解决(Junit)