簡體   English   中英

Spring 引導測試 (JUnit) 中的 Aspect 方法的依賴注入

[英]Dependency Injection to Aspect method in Spring Boot Test (JUnit)

當我不使用我的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)}

彈簧靴:好的

@RequiredArgsConstructor
@Slf4j
public class CronLogServiceImpl implements CronLogService {

    private CronLogRepository cronLogRepository;

測試:沒有 spring 錯誤,但cronLogRepository是 null。 所以cronLogRepository.save返回一個java.lang.NullPointerException

springboot: CronLogServiceImpl.create 上的 java.lang.NullPointerException: CronLogServiceImpl.create

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

可能錯誤在這一行,嘗試用@SpringBootTest替換它,如果它有效,那么錯誤在上下文配置中。 我認為,您需要將CronLogServiceImpl添加到要添加到上下文的類列表中。

這能解決你的問題嗎? 在評論中告訴我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM