12

在编写方面时,我如何测试它们是否匹配以及在我想要它们时调用它们?

我在@AspectSpring 2.5.6 中使用声明。


我不关心功能,否则会提取和测试。

4

2 回答 2

8

这里需要测试三种不同的东西:

  1. 您的切入点是否符合您的预期?
  2. 您的建议是否引用了正确的切入点?
  3. 建议是否如您所愿?

要测试切入点,您可以定义一些与预期的“真实”目标具有相同包/类型/方法签名的测试类型,然后针对切入点定义测试建议以确保它们匹配(还定义一些不应该的类型) t 匹配以确保切入点不太自由)。我通常通过定义建议对测试目标中的方法进行回调,设置标志,然后断言已设置标志来做到这一点。

测试这个建议比较棘手。我倾向于将所有通知主体委托给普通方法,然后专注于测试方法而不是通知。

如果您已经这样做了,唯一缺少的部分是您的建议应用于正确的切入点并实际调用方法。如果您担心这可能是一个问题,您可以通过创建与您的建议执行匹配的另一个方面来做到这一点,并设置一个标志以显示该方面调用了预期的委托方法,并覆盖该方法以不执行任何操作。

于 2009-08-09T13:04:19.567 回答
7

我最终通过以下方式创建了一些有点像集成测试的东西:

创建了一个 Spring 感知的 JUnit 测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "aspects-test.xml" })
public class SomeAspectTest {

}

为此测试创建了一个弹簧配置:

  • 启用@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();
}
于 2009-10-17T21:05:48.937 回答