有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Spring引导测试(JUnit)中的java依赖注入方面方法

当我不使用我的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”类型的合格bean。应用程序。存储库。CronLogRepository'可用:至少需要1个符合autowire候选资格的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在CronLogServiceImpl.create


共 (1) 个答案

  1. # 1 楼答案

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

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

    这能解决你的问题吗?请在评论中告诉我