我在编译时使用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实现。
单位测试的最佳实践方法是什么?
答案 0 :(得分:0)
我找到了解决方案,并希望将其发布给遇到此问题的其他任何人。诀窍是在spring bean定义中使用factory-method="aspectOf"
。因此,使用上面的示例,我会将此行添加到我的applicationContext.xml
<bean class="com.my.package.MyAdviceClass" factory-method="aspectOf"/>
任何我的单元测试看起来都是这样的:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:/META-INF/spring/applicationContext.xml")
public class MyAdviceClassTest {
@Autowired private MyAdviceClass advice;
@Mock private MyExternalResource resource;
@Before
public void setUp() throws Exception {
initMocks(this);
advice.setResource(resource);
}
@Test
public void featureTest() {
// Perform testing
}
}
有更多详情可供here。