【问题标题】:Dependency Injection to Aspect method in Spring Boot Test (JUnit)Spring Boot Test (JUnit) 中的 Aspect 方法的依赖注入
【发布时间】:2021-12-28 10:53:01
【问题描述】:

当我不使用我的CronLogService 时,我的 Aspect 方法有效,但如果我注入这个我有这个错误:

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)}

springboot:好的

@RequiredArgsConstructor
@Slf4j
public class CronLogServiceImpl implements CronLogService {

    private CronLogRepository cronLogRepository;

测试:没有弹簧错误,但cronLogRepository 为空。所以cronLogRepository.save返回java.lang.NullPointerException

springboot: java.lang.NullPointerException: null on CronLogServiceImpl.create

【问题讨论】:

  • CronLogServiceImpl 不在@SpringBootTest 的类列表中..

标签: java spring-boot junit


【解决方案1】:

@SpringBootTest(classes = {TaskService.class, CronLoggerAspect.class, CronLogService.class, CronLogRepository.class})

错误可能在这一行,尝试用 @SpringBootTest 替换它,如果有效,则错误在上下文配置中。 我认为您需要将CronLogServiceImpl 添加到要添加到上下文的类列表中。

这能解决您的问题吗?在 cmets 中告诉我。

【讨论】:

  • 私有最终 CronLogRepository cronLogRepository; --> 从这里删除 final ...
  • 这与注入存储库有关。您可以尝试直接将 @Autowired 直接移到场上
  • 谢谢,您的解决方案肯定离工作不远了,只剩下一个问题了。错误:No qualifying bean of type 'com.orange.planning.modules.admin.repository.CronLogRepository'
  • 显示 CronLogRepository 的代码。将其添加到问题中! :3 :D
  • 我在@SpringBootTest 中将CronLogService 更改为CronLogServiceImpl。我删除了CronLogServiceImpl 中的final。所以现在,没有弹簧错误,但cronLogRepository 为空。所以cronLogRepository.save返回java.lang.NullPointerException
猜你喜欢
  • 2017-04-10
  • 2020-07-09
  • 2018-11-21
  • 1970-01-01
  • 1970-01-01
  • 2016-06-05
  • 1970-01-01
  • 2016-07-16
  • 1970-01-01
相关资源
最近更新 更多