gpt4 book ai didi

unit-testing - 模拟 OSGi 上下文中的服务激活异常

转载 作者:行者123 更新时间:2023-12-04 01:38:19 24 4
gpt4 key购买 nike

在我的 Maven 项目中,我创建了一个简单的 OSGi 服务,它只接受一个引用:

import org.apache.sling.api.resource.ResourceResolverFactory;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;

@Component
public class MyFoo {
@Reference
private ResourceResolverFactory factory;
}

然后,使用 osgi-mock 教程,我创建了以下测试类:

import org.apache.sling.api.resource.ResourceResolverFactory;
import org.apache.sling.testing.mock.osgi.junit.OsgiContext;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
public class MyFooTest {
@Rule
public OsgiContext mockContext = new OsgiContext();

@Test
public void test() {
ResourceResolverFactory mockFactory = Mockito.mock(ResourceResolverFactory.class);

mockContext.registerService(ResourceResolverFactory.class, mockFactory);
mockContext.registerInjectActivateService(new MyFoo());
}

}

测试在最后一行崩溃,出现以下异常:

org.apache.sling.testing.mock.osgi.NoScrMetadataException: No OSGi SCR metadata found for class MyFoo

at org.apache.sling.testing.mock.osgi.OsgiServiceUtil.injectServices(OsgiServiceUtil.java:381)
at org.apache.sling.testing.mock.osgi.MockOsgi.injectServices(MockOsgi.java:148)
at org.apache.sling.testing.mock.osgi.context.OsgiContextImpl.registerInjectActivateService(OsgiContextImpl.java:153)
at org.apache.sling.testing.mock.osgi.context.OsgiContextImpl.registerInjectActivateService(OsgiContextImpl.java:141)
at MyFooTest.testGetResolver(MyFooTest.java:22)
//snippet

按照互联网上的建议,我到达了this configuration guide并确保我的 pom.xml 具有针对 maven-bundle-plugin 的正确配置 - 但这并没有解决问题。

知道我哪里出错了吗?

最佳答案

我尝试重现您的问题,最初遇到了同样的异常,现在可以正常使用了。问题可能是由于 maven-scr-pluginmaven-bundle-plugin 之间的传递依赖性导致类路径损坏。

确保您具备以下条件:

  • 使用与 OSGI R6 兼容的 osgi-mock 2.x 模拟依赖项。这是我用的。

        <dependency>
    <groupId>org.apache.sling</groupId>
    <artifactId>org.apache.sling.testing.osgi-mock</artifactId>
    <version>2.3.6</version>
    <scope>test</scope>
    </dependency>
  • 像这样删除 scr maven 插件和依赖项(maven-scr-pluginorg.apache.felix.scr)与 OSGi R6 注释一起使用时会导致类路径冲突。这是我使用过的 maven-bundle-plugin 版本。我从 here 中获取了所有必需的依赖项.

            <plugin>
    <groupId>org.apache.felix</groupId>
    <artifactId>maven-bundle-plugin</artifactId>
    <version>3.2.0</version>
    </plugin>
  • 确保您的插件构建部分包含生成所需 DS 元数据所需的配置。您可以引用您链接的 felix 文档以获取更多信息。

        <plugin>
    <groupId>org.apache.felix</groupId>
    <artifactId>maven-bundle-plugin</artifactId>
    <extensions>true</extensions>
    <executions>
    <execution>
    <id>scr-metadata</id>
    <goals>
    <goal>manifest</goal>
    </goals>
    </execution>
    </executions>
    <configuration>
    <exportScr>true</exportScr>
    <instructions>
    <Bundle-SymbolicName>com.aem.chula.chula</Bundle-SymbolicName>

    <Sling-Model-Packages>
    com.aem.models
    </Sling-Model-Packages>

    <_dsannotations>*</_dsannotations>
    <_metatypeannotations>*</_metatypeannotations>
    </instructions>
    </configuration>
    </plugin>
  • 执行 mvn clean install,这将在 /OSG-INF 中生成 DS 输出。

  • 运行您的测试。我使用过 MockitoJunitRunner,应该也能与 PowerMock 一起正常工作。

enter image description here

关于unit-testing - 模拟 OSGi 上下文中的服务激活异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48551036/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com