2009-08-09 94 views
10

在编写方面时,如何测试它们是否匹配,以及在我希望它们调用时调用它们?测试Spring AOP方面

我在Spring 2.5.6中使用@Aspect声明。


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

回答

7

我结束了创建一些东西,是一个有点集成测试,以下列方式:

创建一个Spring的JUnit测试

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

} 

创造了这个测试,弹簧的配置:

  • 启用@AspectJ用法;
  • 配置我的虚拟依赖方面
  • 声明应由方面

    <aop:aspectj-autoproxy /> 
    <bean class="SomeAspect"> 
        <property name="userDetailsSource"> 
          <bean class="StubUserDetailsSource"/> 
        </property> 
    </bean> 
    <bean class="DummyService"/> 
    

拾起在单元测试中检索到的虚拟服务,并调用其方法的Bean

@Autowired 
private DummyService _dummyService; 

@Test(expected = ApplicationSecurityException.class) 
public void adminOnlyFails() throws ApplicationSecurityException { 

    _dummyService.adminOnly(); 
} 
+0

你能给出更多细节吗? – Javatar 2012-04-20 06:44:50

+2

我认为创建半集成测试是正常的,因为如此多的逻辑实际上是运行时生成的。 – Gepsens 2012-09-10 13:07:24

+0

所以你调用一个应该调用方面方法的方法,但是你从来没有回答如何验证方法方法被调用。 @Javatar我认为这就是你正在寻找的细节?我猜你的示例方面总是抛出一个ApplicationSecurityException?那么合法的方法调用呢? – Jorge 2013-09-05 21:08:24

8

有三种不同的东西在这里进行测试:

  1. 是你的切入点符合你的期望?
  2. 你的建议是否引用了正确的切入点?
  3. 建议是否按照您的预期行事?

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

要测试建议是棘手的。我倾向于将所有的建议主体委托给一个正常的方法,然后专注于测试方法而不是建议。

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