1

config.propertiesアクティブ化プロセス中に Apache Felixのファイルからいくつかのプロパティを読み取る OSGi バンドルがあります。この構成が正しくないか存在しない場合、バンドルは開始されません。このために、それぞれの単体テストを作成しています。テストには Arquillian を使用しています。conf.properties各シナリオをカバーするために、さまざまなタイプの Arquillian テストをさまざまな Arquillian テストに提供したいときに問題が発生します。

Arquillian がテストを実行するとframework.properties、フォルダーからファイルをロードして/test/resources/Apache Felix を初期化し、テスト バンドルをインストールしてテストを実行します。framework.propertiesさて、私の質問は、テスト ケースごとに異なるファイルを提供するにはどうすればよいかということです。

これが私が使用する Arquillian Unit Test です。

@RunWith(Arquillian.class)
public class PersistenceLoaderTest {

    @Deployment
    public static Archive<?> createDeployment() {
        final JavaArchive archive = ShrinkWrap.create(JavaArchive.class, "persistence-arq.jar");

        archive.addClass(ProviderLoader.class);
        archive.setManifest(new Asset() {
            public InputStream openStream() {
                OSGiManifestBuilder builder = OSGiManifestBuilder.newInstance();
                builder.addBundleSymbolicName(archive.getName());
                builder.addBundleManifestVersion(2);                    
                builder.addImportPackages("org.osgi.service.startlevel", "org.osgi.service.url");
                builder.addImportPackages(ProviderLoader.class);
                return builder.openStream();
            }
        });

        return archive;
    }

    @ArquillianResource
    public Bundle bundle;

    @ArquillianResource
    BundleContext bundleContext;

    @Test
    public void loadFrameworkConfiguration(){
        // What goes here?
    }
}

そしてframework.propertiesファイル:

# The Felix Framewok log level
#
# ERROR = 1;
# WARNING = 2;
# INFO = 3;
# DEBUG = 4;
felix.log.level=4

org.domain.database=mydb
org.domain.driver=org.hsqldb.jdbcDriver
org.domain.url=jdbc:hsqldb:file:
org.domain.username=sa
org.domain.password=

これらは、さまざまなシナリオで変更してテストする必要があるプロパティ値です。

4

1 に答える 1

0

私の理解では、これはコンテナ レベルのプロパティであり、デプロイ レベルのプロパティではないため、有効にするにはコンテナを再起動する必要があります。

これは、arquillian.xml のコンテナ モードを手動に設定することで実現できます。

<arquillian>
   <container qualifier="manual_felix" mode="manual">
   </container>
</arquillian>

次に、TestClass で ContainerController を注入し、実行ごとに新しいプロパティで開始できます。

@RunWith(Arquillian.class)
public class TestA {

   @Deployment(name = "x", managed = false) @TargetsContainer("manual_felix")
   public static Archive<?> deployment() {
      return ShrinkWrap.create....
   }

   @ArquillianResource
   private ContainerController cc;

   @ArquillianResource
   private Deployer d;


   @Test @InSequence(1)
   public void start() {
      cc.start("manual_felix", new Config().add("frameworkProperties", "my-custom-properties-file"));
      d.deploy("x");
   }

   @Test @InSequence(2) @OperatesOnDeployment("x")
   public void shouldDoSomethingInsideX() {
       // executes inside container in context of X
   }
}
于 2015-03-23T23:34:37.263 に答える