【问题标题】:How to use inject resource from server (like ManagedExecutorService) in Junit-Test of Spring如何在 Spring 的 Junit-Test 中使用来自服务器的注入资源(如 ManagedExecutorService)
【发布时间】:2014-06-30 09:57:29
【问题描述】:

我在我的代码中使用 ManagedExecutorService 进行并发,如下所示:

 @Resource
private ManagedExecutorService defaultManagedExecutorService;

如果我构建它们并将它们部署在我的服务器上,它工作正常,因为我引用了服务器上的资源 ManagedExecutorService:

<managed-executor-service name="default" jndi-name="java:jboss/ee/concurrency/executor/default" context-service="default" hung-task-threshold="60000" core-threads="5" max-threads="25" keepalive-time="5000"/>

但我有基于 Spring 的 Junit 测试。为了运行这个测试,我不需要任何服务器。所以我得到了以下异常:

Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [javax.enterprise.concurrent.ManagedExecutorService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@javax.annotation.Resource(mappedName=, shareable=true, description=, name=, type=class java.lang.Object, authenticationType=CONTAINER, lookup=)}

好像spring从服务端找不到我的资源。

我现在能做什么?

谢谢!

【问题讨论】:

    标签: spring concurrency junit wildfly


    【解决方案1】:

    您需要“模拟”该功能,这意味着使用类似的实现来模拟真实的交易,这种实现并不真正进入服务器并检索 JNDI 资源,而是使用假结果。

    Spring中有一个包提供了一些测试JNDI资源的功能,你可以找到它的源代码here

    要开始使用该包中的类,我将查看 Spring 自己的测试类,其中使用了这些 JNDI 模拟类。例如,请参阅here 这些类如何用于测试 JTA 事务管理器。

    我实际上没有使用过这个,但我会尝试这样的:

    import static org.mockito.BDDMockito.*;
    ....
    ManagedExecutorService mes = mock(ManagedExecutorService.class);
    ExpectedLookupTemplate jndiTemplate = new ExpectedLookupTemplate();
    jndiTemplate.addObject("java:jboss/ee/concurrency/executor/default", mes);
    ...
    

    或者您可以查看 this 以获取另一个需要模拟 ManagedExecutorService 的测试类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-23
      • 2021-02-13
      • 2012-07-08
      • 1970-01-01
      • 1970-01-01
      • 2020-08-27
      • 2015-08-05
      • 2022-08-24
      相关资源
      最近更新 更多