有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java测试SpringAOP方面

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

我在Spring2.5.6中使用了@Aspect声明


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


共 (2) 个答案

  1. # 1 楼答案

    这里有三个不同的测试:

    1. 你的切入点是否符合你的预期
    2. 你的建议参考了正确的切入点吗
    3. 建议是否如你所料

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

    检验这个建议更为棘手。我倾向于将所有建议主体委托给一个普通的方法,然后专注于测试该方法,而不是建议

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

  2. # 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();
    }