使用 Mockito 使用 @Transactional 方法模拟类

2024-01-06

我有一个服务,一个 bean,其中包含@Transactional method:

public class InMessageService {

...

    @Transactional

    public boolean retryInMessage(String messageId) {

    ...

    }

}

为了进行测试,我尝试使用 Mockito 模拟该服务:

@Bean
@Primary
public InMessageService inMessageService() {
    return Mockito.mock(InMessageService.class);
}

当我开始测试时,结果是以下异常:

   Caused by: org.springframework.aop.framework.AopConfigException: Could not generate CGLIB
subclass of class somePackage.InMessageService$MockitoMock$156222813: Common
causes of this problem include using a final class or a non-visible class;nested exception is
org.springframework.cglib.core.CodeGenerationException: java.lang.NoClassDefFoundError-->
somePath/InMessageService$MockitoMock$156222813

我想提一下,相同的代码适用于 spring-boot 1.2.1 和 Mockito 1.10.19。我尝试使用 spring boot 2.1.1 和 Mockito 2.23.0 运行上面的代码

到目前为止我的观察:

  • 无论我使用 2.1.0 和 2.23.0 之间的哪个 Mockito 版本,例外情况都是相同的。我不能(也不想)使用旧版本的 Mockito,因为该项目不再编译
  • 如果我暂时删除@Transactional注解,则不会抛出异常。

有什么想法必须通过 Spring Boot 的升级进行调整才能使测试再次工作吗?

谢谢 !


从 2.1.0 版开始,Mockito 保留了代理方法上的注释。这意味着 Spring 尝试代理声明事务注释的模拟类,但会失败,因为模拟方法是最终的。

之前,Mockito 删除了这些注释,这些注释可能会导致任何实际方法调用因缺少事务而失败。

为了避免这种情况,您需要删除模拟的注释。您可以使用MockSettings.withoutAnnotations.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Mockito 使用 @Transactional 方法模拟类 的相关文章

随机推荐