【问题标题】:Spring AOP with Mock, Spy. AspectJProxyFactory cannot addAspect Mock instance带有 Mock、Spy 的 Spring AOP。 AspectJProxyFactory 无法添加Aspect Mock 实例
【发布时间】:2020-11-16 10:16:49
【问题描述】:

我正在尝试单元测试,其中方面类在单元测试时运行良好。

情况。

  • 从 1.5.9 升级 Spring Boot -> 2.3.1。
  • Mockito、Junit 框架升级(mockito-core 1.10.19 -> 3.3.3)

我有一个问题,即升级时 Spring AOP(内部 AspectJ)的单元测试不会通过。原因在于AbstractAspectJAdvisorFactory 类从哪里验证给定的方面类是否是真正的方面类。

我的代码

    @Mock
    private RepositoryAspect aspect;

    @InjectMocks
    private NicknameRepository nicknameRepository;

    @Before
    public void setup() {

        AspectJProxyFactory aspectJProxyFactory = new AspectJProxyFactory(nicknameRepository);
        aspectJProxyFactory.addAspect(aspect); // fails 
        nicknameRepository = aspectJProxyFactory.getProxy();
    }

https://github.com/spring-projects/spring-framework/blob/0819a9fcc9a1168521995e0bac7de5633a819780/spring-aop/src/main/java/org/springframework/aop/aspectj/annotation/AbstractAspectJAdvisorFactory.java#L105-L110

public void validate(Class<?> aspectClass) throws AopConfigException {
    // If the parent has the annotation and isn't abstract it's an error
    if (aspectClass.getSuperclass().getAnnotation(Aspect.class) != null &&
            !Modifier.isAbstract(aspectClass.getSuperclass().getModifiers())) {
        throw new AopConfigException("[" + aspectClass.getName() + "] cannot extend concrete aspect [" +
                    aspectClass.getSuperclass().getName() + "]");
    }
...

它正常工作。但是,从 mockito-core 1.10.19 升级到 3.3.3 后,我发现由于封装的 Mock 类不同,验证失败。

1.10.19
<instance>$$EnhancerByMockitoWithCGLIB => not classified as a Mock class

3.3.3
<instance>$$MockitoMock => classified wrapped Mock class, not an aspect class

我的研究如下。我刚刚发现 Spring AOP 并没有使用 Mockito 作为注入方面,而是一个真实的实例及其变量。我找不到期望代码的正确方法。如何尝试使用 Mockito?

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/aop/aspectj/annotation/AspectJProxyFactory.html

http://useof.org/java-open-source/org.springframework.aop.aspectj.annotation.AspectJProxyFactory

https://github.com/spring-projects/spring-framework/blob/3aa2605fdaa56d5c007f476f3f9bd1c550ec368c/spring-context/src/test/java/org/springframework/aop/aspectj/BeanNamePointcutAtAspectTests.java

【问题讨论】:

  • 你解决了吗?
  • @MariaInesParnisari 不。我现在只是暂时跳过单元测试。

标签: unit-testing junit mockito spring-aop


【解决方案1】:

更换

aspectJProxyFactory.addAspect(aspect);

aspectJProxyFactory.addAspect(RepositoryAspect.class);

解决了这个问题并触发了切面(尽管它无助于解决在测试中验证切面本身,如果这是目标的话)

【讨论】:

    猜你喜欢
    • 2015-04-02
    • 2020-09-07
    • 1970-01-01
    • 1970-01-01
    • 2016-04-04
    • 2020-10-21
    • 2016-02-22
    • 1970-01-01
    相关资源
    最近更新 更多