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

Posted

技术标签:

【中文标题】如何使用 JUnit 测试 Spring Boot aspectj 方法?【英文标题】:How to test an SpringBoot aspect method with JUnit? 【发布时间】:2021-12-26 20:59:41 【问题描述】:

我使用 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 方法:

@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();
    


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

【问题讨论】:

如果您使用运行时编织,希望您使用 -javaagent:<path-to-aspectjweaver-jar> 开始测试。 【参考方案1】:
@ExtendWith(SpringExtension.class)
@SpringBootTest
@ActiveProfiles("sit")
class TaskTest 

    @Autowired
    private TaskService taskService;

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

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

【讨论】:

以上是关于如何使用 JUnit 测试 Spring Boot aspectj 方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Mockito 和 JUnit 在 Spring Boot 中测试 POST 方法

如何 JUnit 测试 Spring-Boot 的 Application.java

如何在单个 JUnit 测试中运行两个 Spring Boot 微服务?

如何在 Spring Boot 和 JUnit 测试中定义 spring.config.location?

java - 如何使用SpringJUnit4TestRunner在junit测试中隐藏spring boot banner.txt?

如何在 Junit5 / spring boot 中命令执行控制器测试类?