Тестирование единиц измерения Spring @Методы AOP - программирование

Тестирование единиц измерения Spring @Методы AOP

Я могу unit test большинство моих классов Spring без необходимости делать Spring "stuff".

Я могу unit test @Во время советов без использования Spring:

Пример кода:

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

Пример теста:

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

Тем не менее, @Around советы касаются объекта ProceedingJoinPoint:

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

Я не знаю, как создать экземпляр объекта ProceedingJoinPoint. Как проверить этот класс без запуска всего контекста приложения Spring?

4b9b3361

Ответ 1

Вы можете протестировать аспект Spring, создав прокси программно:

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

... тогда вы можете вызывать методы на proxy и делать утверждения о aspect, proxy и target.