web-dev-qa-db-fra.com

Test unitaire des méthodes Spring @Around AOP

Je peux tester à l'unité la plupart de mes cours de printemps sans avoir à faire de "trucs" de printemps.

Je peux tester de manière unitaire les méthodes @Before sans utiliser Spring aussi:

Exemple de code:

@Before("execution(* run(..)) && " + "" +
          "target(target) && " +
        "args(name)")
public void logName(Object target, String name) {
    logger.info("{} - run: {}", target, name);
}

Exemple de test:

@Test
public void testLogName() {
    aspect.setLogger(mockLogger);
    aspect.logName(this,"Barry");
    assertTrue(mockLogger.hasLogged("TestAspect - run: Barry"));
}

Cependant, les conseils @Around traitent d'un objet ProceedingJoinPoint:

@Around("com.xyz.myapp.SystemArchitecture.businessService()")
public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
   // start stopwatch
   Object retVal = pjp.proceed();
   // stop stopwatch
   return retVal;
 }

Je ne sais pas comment instancier un objet ProceedingJoinPoint. Comment tester cette classe sans démarrer un contexte d'application Spring entier?

31
slim

Vous pouvez tester un Spring Aspect en créant un proxy par programmation:

MyInterface target = new MyClass();
AspectJProxyFactory factory = new AspectJProxyFactory(target);
MyAspect aspect = new MyAspect(arg);
factory.addAspect(aspect);
MyInterface proxy = factory.getProxy();

... alors vous pouvez appeler des méthodes sur proxy et faire des assertions sur aspect, proxy et target.

68
slim