如何使用 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?