Java >> Programma Java >  >> Tag >> Spring

Come testare un aspetto con SpringBootTest?

Ho avuto un problema simile. Il mio aspetto sta ascoltando i metodi del controller. Per attivarlo, importare il AnnotationAwareAspectJAutoProxyCreator fatto il trucco:

@RunWith(SpringRunner.class)
@Import(AnnotationAwareAspectJAutoProxyCreator.class) // activate aspect
@WebMvcTest(MyController.class)
public class MyControllerTest {

    ...

}

Devi iniziare un @SpringBootApplication . Tuttavia, non deve essere quello che usi per avviare l'app in produzione. Può essere speciale solo per questo test e può essere nella radice delle tue sorgenti di test non nel tuo src.

@SpringBootApplication
@ComponentScan(basePackageClasses = {DemoComponent.class, TimeLoggerAspect.class})
public class SpringBootTestMain {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootTestMain.class, args);
    }

}

Quindi nel tuo test questa è l'unica classe che devi elencare.

@ExtendWith(SpringExtension.class)
@SpringBootTest(classes = SpringBootTestMain.class)
public class DemoComponentFailTest {

Devi inserire @EnableAspectJAutoProxy con il tuo file @Configuration che dichiara il bean con @Aspect.

@Aspect
@Configuration
@EnableAspectJAutoProxy
public class TimeLoggerAspect {

  private static final Logger log = LoggerFactory.getLogger(TimeLoggerAspect.class);

  @Around("@annotation(demo.TimeLogger)")
  public Object methodTimeLogger(ProceedingJoinPoint joinPoint) 
          throws Throwable {
    long startTime = System.currentTimeMillis();

    Object proceed = joinPoint.proceed();

    long totalTime = System.currentTimeMillis() - startTime;
    log.info("Method " + joinPoint.getSignature() + ": " + totalTime + "ms");

    return proceed;
  }
}

Penso che farà il lavoro.


Etichetta Java