Estou usando o spring-boot 3.4.2.
Quero usar aspectos do AOP para modificar anotações que uso em um teste de inicialização de primavera.
No entanto, meu método @Around não é acionado durante a execução do teste. Se eu anotar, por exemplo, um método de endpoint dentro de um controlador rest, ele é acionado. Mas eu quero usá-lo para testes.
Aqui está minha anotação:
@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation {
}
Aqui está meu aspecto:
@Aspect
@Component
public class TestAspect {
public TestAspect() {
// this is called - so @Component works
System.out.println("aspect constructor called");
}
@Around("@annotation(TestAnnotation)")
public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
// this is NOT called in the test - @Around did not work
System.out.println("aroundAdvice() called");
return joinPoint.proceed();
}
}
E aqui está meu teste:
@SpringBootTest
@ComponentScan(basePackages = { "de.mycompany" }) // root of all my packages
@TestPropertySource(value = "classpath:application-test.yml", factory = YamlPropertySourceFactory.class)
@AutoConfigureMockMvc
class MyTestClass {
@Autowired
private MockMvc mockMvc;
@Test
@TestAnnotation
void testSomething() throws Exception {
System.out.println("testSomething() called.");
// test something with mockMvc
}
}
Se eu anotar um endpoint em um RestController, aroundAdvice()
ele será disparado sempre que esse endpoint for chamado ou testado. Mas preciso que ele seja disparado quando meu método de teste (aqui: testSomething()
) for chamado. E isso não funciona.
Usar a classe totalmente qualificada em @Around
também não funciona:
@Around("@annotation(de.mycompany.annotation.TestAnnotation)")