You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用JUnit测试SpringBoot中的自定义Aspect切面方法?

问题根因

你当前使用MockitoExtension进行测试,通过@InjectMocks创建的ImportTask是普通原生Java对象,没有被Spring AOP生成的代理对象包装,因此切面逻辑不会触发。同时测试上下文未将自定义切面类CronLoggerAspect纳入管理,即使有代理也无法匹配到对应切面。

解决方案

改用Spring测试体系,加载需要的Bean到Spring上下文,获取代理后的测试目标实例即可,修正后的测试代码如下:

@Slf4j
// 替换Mockito扩展为Spring测试扩展,同时导入需要的类到Spring上下文
@SpringJUnitConfig(classes = {
        ImportTask.class,
        CronLoggerAspect.class,
        AnnotationAwareAspectJAutoProxyCreator.class
})
class ImportTaskTest {

    // 注入Spring代理后的实例,不要用@InjectMocks
    @Autowired
    private ImportTask importTask;

    // 如果ImportTask存在依赖需要Mock,使用@MockBean注入Spring上下文托管的Mock对象
    // @MockBean
    // private XxxDependency xxxDependency;

    @Test
    void importData() throws JSchException, SftpException, SftpTransfertException {
        importTask.importData();
        // 执行完方法后即可验证切面逻辑已执行
    }
}

其他注意事项

  • 如果CronLoggerAspect切面类和CronLogger注解不在同一个包下,需要在切面的@Around注解中写注解的全限定类名:@Around("@annotation(com.xxx.xxx.CronLogger)")
  • 如果使用@SpringBootTest进行全量上下文测试,确保切面类所在路径在Spring Boot的组件扫描范围内,或者手动通过@Import(CronLoggerAspect.class)导入切面类
  • 所有需要触发AOP逻辑的测试目标实例,必须从Spring上下文注入,不能手动new或者通过Mockito注解创建原生实例

内容的提问来源于stack exchange,提问作者Stéphane GRILLON

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 05:06:05