在编写方面时,我如何测试它们是否匹配以及在我想要它们时调用它们?
我在@Aspect
Spring 2.5.6 中使用声明。
我不关心功能,否则会提取和测试。
在编写方面时,我如何测试它们是否匹配以及在我想要它们时调用它们?
我在@Aspect
Spring 2.5.6 中使用声明。
我不关心功能,否则会提取和测试。
这里需要测试三种不同的东西:
要测试切入点,您可以定义一些与预期的“真实”目标具有相同包/类型/方法签名的测试类型,然后针对切入点定义测试建议以确保它们匹配(还定义一些不应该的类型) t 匹配以确保切入点不太自由)。我通常通过定义建议对测试目标中的方法进行回调,设置标志,然后断言已设置标志来做到这一点。
测试这个建议比较棘手。我倾向于将所有通知主体委托给普通方法,然后专注于测试方法而不是通知。
如果您已经这样做了,唯一缺少的部分是您的建议应用于正确的切入点并实际调用方法。如果您担心这可能是一个问题,您可以通过创建与您的建议执行匹配的另一个方面来做到这一点,并设置一个标志以显示该方面调用了预期的委托方法,并覆盖该方法以不执行任何操作。
我最终通过以下方式创建了一些有点像集成测试的东西:
创建了一个 Spring 感知的 JUnit 测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "aspects-test.xml" })
public class SomeAspectTest {
}
为此测试创建了一个弹簧配置:
声明一个应该被切面拾取的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();
}