현재 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();
}
문제가 해결되었습니다. – user2107244