【问题标题】:OSGI Integration testing, Pax Exam probe executing tests before container bundles startOSGI 集成测试,Pax Exam 探针在容器包启动之前执行测试
【发布时间】:2013-02-10 15:20:32
【问题描述】:

我目前正在尝试使用 PAX-EXAM+KARAF 编写 OSGI 集成测试,但遇到了一个问题,即 pax 考试试图在依赖包在容器中实际启动/初始化之前执行测试方法。奇怪的是,有时测试会成功,在这种情况下,所有的包/上下文都会启动并记录下来,但大多数时候它不会。方法的延迟无济于事:(任何人都可以帮助解决这个问题?

我正在使用 PAX-考试 2.6.0, org.apache.karaf.tooling.exam.container 2.3.0, apache-karaf 2.3.0.

代码:

@Inject
BundleContext bundleContext;

@Inject
    EntityManagerFactoryService entityManagerFactoryService;//Service exposed trough OSGI

    protected EntityManager entityManager;

    @Before
    public void init() throws InterruptedException {
        entityManager = entityManagerFactoryService.getEntityManagerFactory().createEntityManager();
    }

@Configuration
    public static Option[] configuration() throws Exception {

    return new Option[] {
            karafDistributionConfiguration().frameworkUrl(maven().groupId("org.apache.karaf").artifactId("apache-karaf").type("zip").versionAsInProject())
                    .karafVersion("2.3.0").name("Apache Karaf"),                
mavenBundle("com.google.guava", "guava", "13.0.1").startLevel(30),
mavenBundle("com.mysql.jdbc", "com.springsource.com.mysql.jdbc", "5.1.6").startLevel(30),
                mavenBundle("javax.persistence", "com.springsource.javax.persistence", "2.0.0").startLevel(30),
                mavenBundle("org.apache.commons", "com.springsource.org.apache.commons.lang", "2.6.0").startLevel(30),

...the rest of bundles  

junitBundles(), };

测试方法:

@Test
    public void contextNotNull() {
        Assert.assertNotNull(entityManagerFactoryService);
    }

日志:

java.lang.ClassNotFoundException: com.startjg.crp.core.dao.service.EntityManagerFactoryService not found by PAXEXAM-PROBE-749fa717-8bdc-4d9a-9803-bdaf6d4edac0 [144]
    at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1460)
    at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:72)
    at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1843)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)

完整日志: https://www.dropbox.com/s/v12r15sbmtu9svp/log.txt

也没有运气尝试过:

protected <T> Object getService(Class<T> serviceClass) {
    int maxCount = 5;
    int delay = 5000;
    for (int i = 0; i <= maxCount; i++) {
        if (bundleContext.getServiceReference(serviceClass) != null) {
            ServiceReference<T> serviceReference = bundleContext.getServiceReference(serviceClass);
            return bundleContext.getService(serviceReference);
        } else {
            try {
                Thread.sleep(delay);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    return null;
}

@Before
public void init() throws InterruptedException {
    EntityManagerFactoryService emfs = (EntityManagerFactoryService) getService(EntityManagerFactoryService.class);
    entityManager = entityManagerFactoryService.getEntityManagerFactory().createEntityManager();
}

【问题讨论】:

    标签: osgi integration-testing apache-karaf pax-exam


    【解决方案1】:

    当前的 pax 考试 3.3.0 现在完全支持 karaf 作为容器。以前的 karaf 考试代码现已完全移至 pax 考试。

    【讨论】:

      【解决方案2】:

      您确定您的 EntityManager 正在工作并且可以作为服务使用吗? 您很可能缺少一些依赖项,这就是包含该服务的捆绑包未完全启动的原因。

      【讨论】:

      • 重点是,如果使用 mavenBundle() 将捆绑包安装到 Karaf 中,则无法保证捆绑包会按所需顺序安装。这导致了一个错误。作为一种解决方法,我使用了已弃用的 pax 考试方法 scanFeatures()。
      • 对于使用 Pax-Exam 2.6 的 pax-exam-karaf,它仍然是工作方式。对于 Pax-Exam 3.0,存在恢复 scanFeatures 配置的问题
      • 是的,我看到 scanFeatures 又回到了 3.0,但我没有设法让它与 karaf 2.3.0 一起使用。
      • 对于 Pax-Exam 3.0,如果您测试 Karaf 并使用 scanFeatures,则您需要使用 2.6 的 Pax-Exam。目前Karaf团队提供的Pax-Exam-Karaf,依然是基于Pax-Exam的2.x线。
      猜你喜欢
      • 2014-03-17
      • 1970-01-01
      • 2016-06-18
      • 2016-06-19
      • 2012-04-29
      • 2020-09-23
      • 2015-01-12
      • 2012-12-24
      • 1970-01-01
      相关资源
      最近更新 更多