如何使用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
相关产品推荐
相关产品推荐

