当前位置: 首页 > 知识库问答 >
问题:

我可以使用OSGi Mocks与声明性服务注释

朱啸
2023-03-14

我正在尝试测试一个用Declaratice Services注释(org.OSGi.service.component.annotations)注释的OSGi服务。我已经根据AEM多项目示例生成了我的项目。

public class PostServiceTest {

  @Rule
  public AemContext context = new AemContext((AemContextCallback) context -> {
    context.registerInjectActivateService(new PostService());
  }, ResourceResolverType.RESOURCERESOLVER_MOCK);

  @Test
  public void shouldFetchRandomPosts() {
    final PostService postsService = context.getService(PostService.class);
    final List<Post> posts = postsService.randomPosts(100);

    assertEquals(100, posts.size());
  }

}

每当我在IntelliJ中运行此测试时,OSGi Mock都会抱怨测试类中缺少SCR元数据。

org.apache.sling.testing.mock.osgi.NoScrMetadataException: No OSGi SCR metadata found for class com.example.PostServiceTest
  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:168)
  at com.example.PostServiceTest.shouldReturnTheEnpointNamesWithValidConfigurationAsTheListOfAcceptableKeys(PostServiceTest.java:23)

这是否意味着我只能测试带有ApacheFelix附带的旧SCR注释的类?OSGi模拟的文档表明2.0版支持声明性服务注释。0及以上。我使用的版本符合此标准。

共有1个答案

尹光辉
2023-03-14

有趣的是,只有当我直接从IDE运行测试时,才会发生这种情况。事实证明,IntelliJ在编译我的类进行测试时并没有生成SCR元数据。

当我用Gradle编译被测试的类时,'com。cognifide。aem。bundle'plugin用于生成SCR描述符并将其放在生成的Java归档文件中。这就是Gradle执行的单元测试工作正常的原因。只需单击IntelliJ中的Run按钮,就会导致错过此步骤。

为了让它工作,我最终设置了IntelliJ,允许我通过Gradle运行单元测试

我去了布景

 类似资料:
  • 我正在将ApacheFelixSCR注释迁移到OSGI声明性服务[AEM]。在迁移过程中,我无法在DS中找到基数的精确替换。 现有的SCR实施: 现在它在OSGi声明性服务中迁移如下 在DS注释实现中,我必须映射@Property中存在的参数基数。请推荐我

  • 创建服务接口,接口必须继承IService。 注意:在异步编程里,异步转同步调用是非常糟糕的,并且有可能死锁。为了避免这个问题,Uragano不支持同步方法,所有的服务方法必须是异步的。 [ServiceDiscoveryName("RPC")] [ServiceRoute("hello")] public interface IHelloService : IService { [Ser

  • 问题内容: 我对Eclipse体系结构中的扩展/服务方法有些困惑。开发人员有两种选择: Eclipse插件扩展的使用-http: //www.eclipse.org/articles/Article-Plug-in-architecture/plugin_architecture.html 声明式服务的使用-http: //www.eclipse.org/equinox/bundles/ 什么时候

  • 我有一个服务层类,它有annotation@Controller和我在线程中生成的服务调用,它正在更新数据库中的某些内容。我在thread的方法中使用了@transaction注释。但我遇到了hibernate异常“找不到会话”。我需要为线程添加任何注释吗? lient.runHibernateException:在lient.java:222没有找到当前线程的Session 4. SpringS

  • 问题内容: 我正在尝试做这样的事情: 但这给了我这个例外: 是否可以将阶段定义为外部闭包? 问题答案: 您不能在声明式管道之外定义阶段。声明性管道的主要目的是提供经过简化且自以为是的语法,因此您可以专注于应该做什么(通过使用一些可用的步骤)而不是如何去做。 如果您对更灵活的管道实现方式感兴趣,可以选择“ 脚本化管道”方法,该语法在语法方面并不严格-仅受Groovy和CPS执行模块的限制。 您的示例

  • 问题内容: 我想在DOCTYPE声明之前在HTML代码的顶部放置一个注释(样式)。这符合标准吗?主要浏览器都支持吗?这样做有什么陷阱吗? 问题答案: 编写 第一本书无疑是最佳实践。 我记得很久很久以前的奇怪问题,其中某些浏览器(可能是IE6)忽略了a, 因为之前似乎有些无辜- 我认为只是空白,但这也许是评论。无论如何,必须进行追踪是一个可怕的错误,而且绝对没有任何理由在 。之前添加注释或空格。 我