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

@Async和Mockito问题

云胤
2023-03-14

我有这门课。

@Service
public class ConcurrentService{

    public Map<String, Object> createList(){
       this.asynCall();
    }

    @Async("taskExecutor")
    private Future<Map<String, Object>> asynCall(){
    .....
    return new AsyncResult<Map<String, Object>>(mapResultMap);
    }

}

我的spring配置是:

<task:annotation-driven executor="taskExecutor"  mode="aspectj" />

<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
    <property name="corePoolSize" value="50" />
    <property name="maxPoolSize" value="300" />
    <property name="queueCapacity" value="30" />
</bean>

还有我的Mockito单元测试

@RunWith(MockitoJUnitRunner.class)
public class ConcurrentServiceTest{

    @InjectMocks
    private ConcurrentService concurrentService;

    @Mock(name = "taskExecutor")
    private ThreadPoolTaskExecutor taskExecutor;

    @Test
    public void test1(){
        Assert.assertNotNull(concurrentService.createList();
    }
}

如果我运行它,我获得了java.lang.IllegalArgumentException:必须在AnnotationAsyncExecutionAspect上设置BeanFactory,才能访问来自org.springframework.scheduling.aspectj.AbstractAsync执行Aspect.ajc$左右$org_springframe work_scheduling_aspectj_AbstractAsync Executionaspect的合格执行器“taskExecution”

如果我删除了注释中的限定符,只留下@Async,那么这个测试会完美运行,但是如果我添加@Async(“taskExecutor”)

我相信Spring不需要运行,因为这只是单元测试,我可以做什么来禁用Mockito中的aop,或者我应该做什么来使用名称“taskExecutor”


共有1个答案

颛孙航
2023-03-14

mode=“aspectj”

<task:annotation-driven executor="taskExecutor" mode="aspectj" />

您正在使用Aspectj编织,需要使用Aspectj maven-plugin在编译时编织方面。要在运行时将Spring的AOP默认框架与代理一起使用,请更改为

<task:annotation-driven executor="taskExecutor" />
 类似资料:
  • 我的服务: 考虑注入bean作为其接口之一,或者通过在@enableAsync和/或@enablecaching上设置ProxyTargetClass=true强制使用基于CGLIB的代理。 我试着在application.properties中设置'spring.aop.proxy-target-class=true'并设置'@enableAsync(Proxytarget-class=true

  • 我在单元测试下面的Spring MVC控制器方法: 上面的自定义注释()基本上是由以下方面建议的: 如果抛出了一个,则会启动以下控制器建议异常处理程序: 现在,以下是我如何尝试测试上述控制器方法: 测试系统地失败了,下面的堆栈跟踪: 我不确定我和莫奇托有什么问题... 注意,我确实在路径中指定了,这表明我的模拟应该在方面中返回true,并允许控制器方法继续。然而,事实并非如此。 谁能帮忙吗?

  • 不确定这里遗漏了什么,但console.log()行打印的是“promise{}”,而不是响应中的JSON正文。 我认为我在async/await中做错了什么。 我的代码(快速): 感谢任何帮助。

  • 我试图理解为什么下面两个代码块会产生不同的结果。 代码块1按预期工作,并返回从数据库中查找的提供程序的数组。另一方面,代码块2返回函数数组。在理解promissione.all()和async/await时,我觉得缺少了一些简单的东西。 代码块的差异如下: > 块1:创建许诺函数数组,然后使用map运算符将其包装在异步函数中。 块2:许诺函数的数组被创建为异步函数。因此,不调用map运算符。 如果

  • 我正在做一个应用程序使用flutter框架。在此过程中,我遇到了Dart和中的关键字。谁能告诉我它们有什么不同吗?

  • 问题内容: 我直到今天才开始了解Mockito。我写了一些简单的测试(使用JUnit,请参见下文),但是我不知道如何在Spring的托管bean中使用模拟对象。什么是使用Spring的最佳实践。我应该如何向我的bean注入模拟依赖项? 你可以跳过这一步,直到回到我的问题。 首先,我学到了什么。这是一篇很好的文章Mocks Are n’t Stubs,它解释了基础知识(Mock的检查行为验证而不是状