【发布时间】:2014-02-12 19:01:43
【问题描述】:
我在编译时使用aspectj maven plugin 来编织Aspects。当我运行应用程序时,带有@Advice 注释的类在第一次调用通知之前被实例化。例如:
@Aspect
public class MyAdviceClass {
public MyAdviceClass() {
System.out.println("creating MyAdviceClass");
}
@Around("execution(* *(..)) && @annotation(timed)")
public Object doBasicProfiling(ProceedingJoinPoint pjp, Timed timed) throws Throwable {
System.out.println("timed annotation called");
return pjp.proceed();
}
}
如果我有一个使用@Timed注解的方法,那么第一次调用该方法时将打印“正在创建的MyAdviceClass”,并且每次都会打印“调用的定时注解”。
我想通过模拟MyAdviceClass 中的一些组件来对建议的功能进行单元测试,但是不能这样做,因为MyAdviceClass 是由 AspectJ 及时实例化的,而不是通过 Spring Beans。
对此类进行单元测试的最佳实践方法是什么?
【问题讨论】:
-
通常单元测试涉及模拟外部依赖项,但我没有看到任何。我猜你想模拟一些外部依赖项?或者你想嘲笑这个建议?
-
使用其构造函数创建一个
MyAdviceClass实例,为ProceedingJoinPoint和Timed使用模拟? -
@Taylor,为简单起见,我已将它们排除在外。 @RC.,你是对的,我可以通过这种方式测试
doBasicProfiling方法,但我还想测试在执行带注释的方法时是否调用了建议。 -
最简单的方法是模拟切面的外部性(一些服务/dao/它调用的任何东西),注入它,并验证它是否按预期调用
-
是的,完全正确。不幸的是,由于 AspectJ 是在第一次需要它时创建实例而不是通过 Spring Bean,所以我找不到它为进行注入而创建的实例。
标签: java spring junit aspectj aspectj-maven-plugin