1

config.properties我有一个 OSGi 包,它在激活过程中从 Apache Felix 的文件中读取一些属性,如果此配置格式错误或不存在,则该包不应该启动。为此,我正在创建其各自的单元测试,我正在使用 Arquillian 进行测试。当我想为conf.properties不同的 Arquillian 测试提供不同类型的测试以涵盖每种情况时,就会出现问题。

当 Arquillian 运行测试时,它会framework.properties/test/resources/文件夹中加载一个文件来初始化 Apache Felix,安装测试包并运行测试。现在,我的问题是如何framework.properties为每个测试用例提供不同的文件?

这是我使用的 Arquillian 单元测试:

@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 回答