gpt4 book ai didi

spring-boot - 使用 Mockito 模拟带有 @Transactional 方法的类

转载 作者:行者123 更新时间:2023-12-04 17:40:47 25 4
gpt4 key购买 nike

我有一个服务,一个包含 @Transactional 方法的 bean:

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 执行此操作。

关于spring-boot - 使用 Mockito 模拟带有 @Transactional 方法的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54592818/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com