Home > OS >  Dependency Injection to Aspect method in Spring Boot Test (JUnit)
Dependency Injection to Aspect method in Spring Boot Test (JUnit)

Time:11-18

My Aspect method work when i do not use my CronLogService but if I Inject this I have this error:

No qualifying bean of type 'com.app.service.CronLogService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}

My Aspect method:

@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);
        ....
    }
}

My service:

@Service
@Transactional
@RequiredArgsConstructor
@Slf4j
public class CronLogServiceImpl implements CronLogService {

    private final CronLogRepository cronLogRepository;

    @Override
    public CronLog create(CronLog cronLog) {
        return cronLogRepository.save(cronLog);
    }
    ...
}

I have this error only on my JUnit test (my Springboot app work!!):

@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");
    }
}

My test service:

@Service
@RequiredArgsConstructor
@Slf4j
public class TaskService {

    @CronLogger(name = "unit test")
    public void testCronLogger(String param) throws CronException {
        log.info("testCronLogger for {}", param);
        ...
    }

}

My CronLogRepository

public interface CronLogRepository extends JpaRepository<CronLog, String> {

}

EDIT:

//@RequiredArgsConstructor
@Slf4j
public class CronLogServiceImpl implements CronLogService {

    @Autowired
    private CronLogRepository cronLogRepository;

test: No qualifying bean of type 'com.app.repository.CronLogRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

springboot: OK

@RequiredArgsConstructor
@Slf4j
public class CronLogServiceImpl implements CronLogService {

    private CronLogRepository cronLogRepository;

test: no spring error but cronLogRepository is null. so cronLogRepository.save return a java.lang.NullPointerException

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

CodePudding user response:

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

Probably the error is in this line, try replacing it with just @SpringBootTest and if it works, then the error is in context configuration. You need to add, I think, CronLogServiceImpl to the list of classes to add to context.

Does this solve your problem ? Let me know in the comments.

  • Related