【问题标题】:Arquillian+OSGi+Test Different Framework PropertiesArquillian+OSGi+测试不同的框架属性
【发布时间】:2015-03-23 22:24:01
【问题描述】:

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

当 Arquillian 运行测试时,它会从 /test/resources/ 文件夹加载一个 framework.properties 文件来初始化 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=

这些是我需要针对不同场景更改和测试的属性值。

【问题讨论】:

    标签: java unit-testing osgi apache-felix arquillian-drone


    【解决方案1】:

    据我了解,这是容器级别的属性,而不是部署级别的属性,因此您需要重新启动容器才能使其生效。

    您可以通过将 arquillian.xml 中的 Container 模式设置为手动来实现。

    <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
       }
    }
    

    【讨论】:

    • 您好,感谢您的回答。有趣的是,如果我将 start()deploy() 主体放在一个测试方法中,我是否可以在每个测试方法上测试不同的框架属性?
    • 是的,这是可行的。仅当您想在部署时执行容器内的某些内容时,才需要拆分测试方法。您无法在尚未部署的内容中进行测试。更新了答案。 note container.mode = managed 在 Class 范围内进行管理,这意味着它只会在 AfterClass 中自动取消部署/停止。如果您想在单个 TestClass 中测试多个启动/停止序列,您还需要为每个 @Test 手动取消部署/停止容器。你可以在@After 中简单地做到这一点。
    • 谢谢,它有效。只是一个细节,如果我想向测试添加捆绑依赖项(例如添加到org.osgi.compendium-5.0.0.jar),使用此配置,我是否必须使用@Deployment 创建一个单独的方法,或者有没有更好的方法?
    • 不确定我是否理解。您不只是将其作为依赖项添加到部署()中定义的存档中的清单中吗?
    • 我为它创建了一个新问题,here你可以阅读详细信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多