2012-03-23 4 views
3

osgiバンドルをロード、アクティブ化、アクセスするためにpax-examを使用しています。BundleContextはpax-examを使用した単体テストではnullです

次のソースコードは、私のPAX-試験テストされ、それはネイティブコンテナを使用してPAX-試験2.3を使用して実行されます。

package fr.xlim.ssd.vtg.osgi; 

import java.net.URISyntaxException; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.ops4j.pax.exam.Inject; 
import org.ops4j.pax.exam.Option; 
import org.ops4j.pax.exam.junit.Configuration; 
import org.ops4j.pax.exam.junit.ExamReactorStrategy; 
import org.ops4j.pax.exam.junit.JUnit4TestRunner; 
import org.ops4j.pax.exam.spi.reactors.AllConfinedStagedReactorFactory; 
import org.osgi.framework.BundleContext; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

import static org.junit.Assert.assertNotNull; 
import static org.ops4j.pax.exam.CoreOptions.bundle; 
import static org.ops4j.pax.exam.CoreOptions.junitBundles; 
import static org.ops4j.pax.exam.CoreOptions.options; 

@RunWith(JUnit4TestRunner.class) 
@ExamReactorStrategy(AllConfinedStagedReactorFactory.class) 
public class BasicOSGILoaderTest { 

    private Logger logger = LoggerFactory.getLogger(BasicOSGILoaderTest.class); 

    @Inject 
    private BundleContext bundleContext; 

    @Configuration 
    public Option[] config() { 

    String projectRoot = null; 

    try { 
     projectRoot = ClassLoader.getSystemResource(".").toURI().toURL().toString(); 
     projectRoot = projectRoot.toString().substring(0,projectRoot.toString().length() - 27); 
     logger.debug("project root: {}", projectRoot); 
    } catch (MalformedURLException e) { 
     logger.error("malformed URL to project root: {}", projectRoot, e); 
     throw new IllegalStateException(e); 
    } catch (URISyntaxException e) { 
     logger.error("URI Syntax Error to project root: {}", projectRoot, e); 
     throw new IllegalStateException(e); 
    } 

    return options(
     junitBundles(), 
     logProfile(), 
     bundle(projectRoot + "libs/org.eclipse.ant.core_3.2.300.v20110511.jar"), 
     bundle(projectRoot + "libs/org.eclipse.core.contenttype_3.4.100.v20110423-0524.jar"), 
     bundle(projectRoot + "libs/org.eclipse.core.expressions_3.4.300.v20110228.jar"), 
     bundle(projectRoot + "libs/org.eclipse.core.jobs_3.5.100.v20110404.jar"), 
     bundle(projectRoot + "libs/org.eclipse.core.resources_3.7.100.v20110510-0712.jar"), 
     bundle(projectRoot + "libs/org.eclipse.core.runtime_3.7.0.v20110110.jar"), 
     bundle(projectRoot + "libs/org.eclipse.equinox.app_1.3.100.v20110321.jar"), 
     bundle(projectRoot + "libs/org.eclipse.equinox.common_3.6.0.v20110523.jar"), 
     bundle(projectRoot + "libs/org.eclipse.equinox.preferences_3.4.1.R37x_v20110725.jar"), 
     bundle(projectRoot + "libs/org.eclipse.equinox.registry_3.5.101.R37x_v20110810-1611.jar"), 
     bundle(projectRoot + "libs/org.eventb.core_2.4.0.r14093.jar"), 
     bundle(projectRoot + "libs/org.eventb.core.ast_2.4.0.r14093.jar"), 
     bundle(projectRoot + "libs/org.eventb.core.seqprover_2.4.0.r14093.jar"), 
     bundle(projectRoot + "libs/org.rodinp.core_1.5.0.r14093.jar"), 
     equinox().version("3.7.1") 
    ); 
    } 

    @Test 
    public void checkBundleContext1() { 
     assertNotNull(bundleContext); 
    } 

    @Test 
    public void checkBundleContext2(BundleContext bc) { 
     assertNotNull(bc); 
    } 

    @Test 
    public void checkAccessToRodinDB() { 
     RodinCore.getRodinDB(); 
    } 
} 

しかし、私は次のような問題ました:

  • 両方checkBundleContext方法は、(@Injectを使用して)を注入または試験方法のパラメータとして渡されたコンテキストをバンドル常にnullで、失敗を

  • バンドルorg.rodinp.core_1.5.0.r14093.jar内のクラスRodinCoreから静的メソッドgetRodinDb()へのアクセスClassNotFoundException程度org.rodinp.core.RodinCore、たとえパッケージを投げますはバンドルのエクスポートパッケージに含まれています。

答えて

6

インポートを確認します。 Service Injection pageから

import javax.inject.Inject; 

を使用します。

注入はjavax.inject.Inject注釈で示されています。 Pax 1.xリリースラインのExam独自のInjectアノテーションは、現在 が推奨されていません。それはPAX-試験試験中に含まれるべき

<groupId>org.ops4j.pax.exam</groupId> 
<artifactId>pax-exam-inject</artifactId> 

+0

すでに存在していますが、わかりやすくするためにコードソースを更新しました。 – Kartoch

+0

[link](http://team.ops4j.org/wiki/display/paxexam/Service+Injection)インジェクションは、javax.inject.Injectアノテーションによって示されます。 – Borbas

+0

YEAH!正しいのですが、正しい解決策は 'javax.inject.Inject'を使うことでした。 – Kartoch

2

チェック依存性。

詳細here

+0

追加されましたが、まだ動作していません:assertNotNullはbundleContextでAssertionErrorをスローし、 '@ Inject'で注釈を付けます – Kartoch

+0

POMも提供できますか? –

関連する問題