如何使用 JUnit 测试 Spring Boot 切面方法?

How to test an SpringBoot aspect method with JUnit?

我使用 Springboot,我想通过 JUnit 测试我的新自定义注释。

我在 importData 方法上带有 @CronLogger 自定义注释的原始代码:

@Service
@RequiredArgsConstructor
@Slf4j
public class ImportTask {
  @Async
  @Scheduled(cron = "${import}")
  @SchedulerLock(name = "import")
  @CronLogger()
  public void importData() {
    ...
  }
}

我的自定义注释:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface CronLogger {
 
}

我的自定义看点方法:

@Aspect
@Component
@EnableAspectJAutoProxy
public class CronLoggerAspect {
    
    private static final Logger log = LoggerFactory.getLogger(CronLoggerAspect.class);
    
    @Around("@annotation(CronLogger)")
    public Object trace(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("CronLogger");
        log.debug("CronLogger");
        return joinPoint.proceed();
    }
}

我的 JUnit 测试:

@Slf4j
@ExtendWith(MockitoExtension.class)
@Import(AnnotationAwareAspectJAutoProxyCreator.class) // activate aspect
class ImportTaskTest {

    @InjectMocks
    private ImportTask importTask;

    @Test
    void importData() throws JSchException, SftpException, SftpTransfertException {
        // execute test
        importTask.importData();
    }

}

结果正常,但没有执行方面方法代码。

@ExtendWith(SpringExtension.class)
@SpringBootTest
@ActiveProfiles("sit")
class TaskTest {

    @Autowired
    private TaskService taskService;

    @Test
    void testCronLoggerSuccess() throws CronException {
        taskService.testCronLogger("test Success");
        ...
    }
}

注意:@ActiveProfiles("sit")用于 H2 数据库。