java测试SpringAOP方面 2 月,1 周 Questions & Answers 15038 在编写方面时,如何测试它们是否匹配,以及是否在需要时调用它们 我在Spring2.5.6中使用了@Aspect声明 我不关心功能,这是提取和测试,否则
# 1 楼答案 这里有三个不同的测试: 你的切入点是否符合你的预期李> 你的建议参考了正确的切入点吗李> 建议是否如你所料李> 为了测试切入点,您可以定义一些测试类型,这些测试类型与预期的“真实”目标具有相同的包/类型/方法签名,然后针对切入点定义一个测试建议,以确保它们匹配(还可以定义一些不应该匹配的类型,以确保切入点不太自由)。我通常通过定义回调测试目标中方法的建议,设置标志,然后断言标志已设置 检验这个建议更为棘手。我倾向于将所有建议主体委托给一个普通的方法,然后专注于测试该方法,而不是建议 如果您已经这样做了,唯一缺少的部分是您的建议被应用到正确的切入点,并实际调用方法。如果您担心这可能是一个问题,您可以通过创建另一个与您的建议执行相匹配的方面,并设置一个标志来显示该方面调用了预期的委托方法,然后重写该方法以不执行任何操作
# 2 楼答案 我最终通过以下方式创建了一个有点像集成测试的东西: 创建了一个支持Spring的JUnit测试 @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "aspects-test.xml" }) public class SomeAspectTest { } 为此测试创建了一个spring配置,其中: 启用@AspectJ用法李> 使用虚拟依赖项配置我的方面 声明一个应该由方面拾取的bean <aop:aspectj-autoproxy /> <bean class="SomeAspect"> <property name="userDetailsSource"> <bean class="StubUserDetailsSource"/> </property> </bean> <bean class="DummyService"/> 在单元测试中,我检索虚拟服务并调用其方法 @Autowired private DummyService _dummyService; @Test(expected = ApplicationSecurityException.class) public void adminOnlyFails() throws ApplicationSecurityException { _dummyService.adminOnly(); }
# 1 楼答案
这里有三个不同的测试:
为了测试切入点,您可以定义一些测试类型,这些测试类型与预期的“真实”目标具有相同的包/类型/方法签名,然后针对切入点定义一个测试建议,以确保它们匹配(还可以定义一些不应该匹配的类型,以确保切入点不太自由)。我通常通过定义回调测试目标中方法的建议,设置标志,然后断言标志已设置
检验这个建议更为棘手。我倾向于将所有建议主体委托给一个普通的方法,然后专注于测试该方法,而不是建议
如果您已经这样做了,唯一缺少的部分是您的建议被应用到正确的切入点,并实际调用方法。如果您担心这可能是一个问题,您可以通过创建另一个与您的建议执行相匹配的方面,并设置一个标志来显示该方面调用了预期的委托方法,然后重写该方法以不执行任何操作
# 2 楼答案
我最终通过以下方式创建了一个有点像集成测试的东西:
创建了一个支持Spring的JUnit测试
为此测试创建了一个spring配置,其中:
声明一个应该由方面拾取的bean
在单元测试中,我检索虚拟服务并调用其方法