2013-02-25 1 views
2

현재 PAX-EXAM + KARAF를 사용하여 OSGI 통합 테스트를 작성하려고하고 있으며 종속 번들이 실제로 실행되기 전에 pax 테스트가 테스트 메소드를 실행하려고 시도하는 문제에 직면했습니다. 컨테이너에서 시작/초기화되었습니다. 이상하게도, 때로는 테스트가 성공하고, 그 경우 모든 번들/컨텍스트가 시작되고 로깅되지만 대다수는 그렇지 않습니다. 방법의 지연은 도움이되지 않습니다 :(누구든지이 문제에 도움을 줄 수?OSGI 통합 테스트, 컨테이너 번들 시작 전에 테스트를 실행하는 Pax Exam 프로브

내가 PAX-EXAM 2.6.0, org.apache.karaf.tooling.exam.container 2.3.0, 아파치를 사용하고 있습니다 . -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(); 
} 
+0

문제가 해결되었습니다. – user2107244

답변

0

확실 당신의 EntityManager 서비스로 일하고 있고 사용할 수 있습니까? 일부 종속성이 누락되었을 가능성이 높으므로 서비스가 포함 된 번들이 완전히 시작되지 않은 것입니다.

+0

mavenBundle()을 사용하여 Karaf에 번들을 설치하면 번들이 원하는 순서로 설치된다는 보장이 없습니다. 이로 인해 오류가 발생했습니다. 임시 해결책으로 나는 deprecated pax 시험 방법 인 scanFeatures()를 사용했습니다. – user2107244

+0

for pax-exam-karaf는 Pax-Exam 2.6을 사용합니다. 여전히 작동하는 방법입니다. Pax-Exam 3.0의 경우 scanFeatures 구성을 부활시키는 문제가 있습니다. –

+0

그래, scanFeatures가 3.0으로 돌아가는 것을 보았지만 karaf 2.3.0으로 작업 할 수 없었습니다. – user2107244

0

현재 pax 시험 3.3.0은 이제 karaf를 컨테이너로 완전히 지원합니다. 전 karaf 시험 코드가 이제 pax 시험으로 완전히 옮겨졌습니다.

관련 문제