【问题标题】:How to test an SpringBoot aspect method with JUnit?如何使用 JUnit 测试 Spring Boot aspectj 方法?
【发布时间】: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> 开始测试。

标签: java spring-boot aspectj spring-boot-test


【解决方案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 数据库。

【讨论】:

    猜你喜欢
    • 2018-12-23
    • 2020-01-20
    • 2020-08-05
    • 1970-01-01
    • 2017-06-06
    • 2019-10-26
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    相关资源
    最近更新 更多