Spring 启动测试 (JUnit) 中的方面方法的依赖注入
Dependency Injection to Aspect method in Spring Boot Test (JUnit)
我的 Aspect 方法在我不使用 CronLogService
时有效,但如果我注入它,我会遇到此错误:
No qualifying bean of type 'com.app.service.CronLogService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
我的看点方法:
@Aspect
@Component
@RequiredArgsConstructor
@EnableAspectJAutoProxy
@Slf4j
public class CronLoggerAspect {
private final CronLogService cronLogService;
@Around("@annotation(CronLogger)")
public Object trace(ProceedingJoinPoint joinPoint) throws Throwable {
String name = MethodSignature.class.cast(joinPoint.getSignature()).getMethod().getAnnotation(CronLogger.class)
.name();
log.debug("start CronLogger for {}", name);
....
}
}
我的服务:
@Service
@Transactional
@RequiredArgsConstructor
@Slf4j
public class CronLogServiceImpl implements CronLogService {
private final CronLogRepository cronLogRepository;
@Override
public CronLog create(CronLog cronLog) {
return cronLogRepository.save(cronLog);
}
...
}
我只在我的 JUnit 测试中遇到这个错误(我的 Springboot 应用程序工作!!):
@ExtendWith(SpringExtension.class)
@SpringBootTest(classes = {TaskService.class, CronLoggerAspect.class, CronLogService.class, CronLogRepository.class})
public class TaskTest {
@Autowired
private TaskService taskService;
@Test
void testCronLoggerSuccess() throws CronException {
taskService.testCronLogger("test Success");
}
}
我的测试服务:
@Service
@RequiredArgsConstructor
@Slf4j
public class TaskService {
@CronLogger(name = "unit test")
public void testCronLogger(String param) throws CronException {
log.info("testCronLogger for {}", param);
...
}
}
我的CronLogRepository
public interface CronLogRepository extends JpaRepository<CronLog, String> {
}
编辑:
//@RequiredArgsConstructor
@Slf4j
public class CronLogServiceImpl implements CronLogService {
@Autowired
private CronLogRepository cronLogRepository;
测试: 没有可用类型 'com.app.repository.CronLogRepository' 的符合条件的 bean:预计至少有 1 个符合自动装配候选条件的 bean。依赖注解:{@org.springframework.beans.factory.annotation.Autowired(required=true)}
spring开机: OK
@RequiredArgsConstructor
@Slf4j
public class CronLogServiceImpl implements CronLogService {
private CronLogRepository cronLogRepository;
测试: 没有 spring 错误,但 cronLogRepository
为空。所以 cronLogRepository.save
return 一个 java.lang.NullPointerException
springboot: java.lang.NullPointerException: CronLogServiceImpl.create
上为空
@SpringBootTest(classes = {TaskService.class, CronLoggerAspect.class, CronLogService.class, CronLogRepository.class})
可能错误出在这一行,尝试将其替换为 @SpringBootTest
,如果有效,则错误出在上下文配置中。
我认为,您需要将 CronLogServiceImpl
添加到 类 的列表中以添加到上下文中。
这是否解决了您的问题?在评论中让我知道。
我的 Aspect 方法在我不使用 CronLogService
时有效,但如果我注入它,我会遇到此错误:
No qualifying bean of type 'com.app.service.CronLogService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
我的看点方法:
@Aspect
@Component
@RequiredArgsConstructor
@EnableAspectJAutoProxy
@Slf4j
public class CronLoggerAspect {
private final CronLogService cronLogService;
@Around("@annotation(CronLogger)")
public Object trace(ProceedingJoinPoint joinPoint) throws Throwable {
String name = MethodSignature.class.cast(joinPoint.getSignature()).getMethod().getAnnotation(CronLogger.class)
.name();
log.debug("start CronLogger for {}", name);
....
}
}
我的服务:
@Service
@Transactional
@RequiredArgsConstructor
@Slf4j
public class CronLogServiceImpl implements CronLogService {
private final CronLogRepository cronLogRepository;
@Override
public CronLog create(CronLog cronLog) {
return cronLogRepository.save(cronLog);
}
...
}
我只在我的 JUnit 测试中遇到这个错误(我的 Springboot 应用程序工作!!):
@ExtendWith(SpringExtension.class)
@SpringBootTest(classes = {TaskService.class, CronLoggerAspect.class, CronLogService.class, CronLogRepository.class})
public class TaskTest {
@Autowired
private TaskService taskService;
@Test
void testCronLoggerSuccess() throws CronException {
taskService.testCronLogger("test Success");
}
}
我的测试服务:
@Service
@RequiredArgsConstructor
@Slf4j
public class TaskService {
@CronLogger(name = "unit test")
public void testCronLogger(String param) throws CronException {
log.info("testCronLogger for {}", param);
...
}
}
我的CronLogRepository
public interface CronLogRepository extends JpaRepository<CronLog, String> {
}
编辑:
//@RequiredArgsConstructor
@Slf4j
public class CronLogServiceImpl implements CronLogService {
@Autowired
private CronLogRepository cronLogRepository;
测试: 没有可用类型 'com.app.repository.CronLogRepository' 的符合条件的 bean:预计至少有 1 个符合自动装配候选条件的 bean。依赖注解:{@org.springframework.beans.factory.annotation.Autowired(required=true)}
spring开机: OK
@RequiredArgsConstructor
@Slf4j
public class CronLogServiceImpl implements CronLogService {
private CronLogRepository cronLogRepository;
测试: 没有 spring 错误,但 cronLogRepository
为空。所以 cronLogRepository.save
return 一个 java.lang.NullPointerException
springboot: java.lang.NullPointerException: CronLogServiceImpl.create
@SpringBootTest(classes = {TaskService.class, CronLoggerAspect.class, CronLogService.class, CronLogRepository.class})
可能错误出在这一行,尝试将其替换为 @SpringBootTest
,如果有效,则错误出在上下文配置中。
我认为,您需要将 CronLogServiceImpl
添加到 类 的列表中以添加到上下文中。
这是否解决了您的问题?在评论中让我知道。