用@Transactional方法用Mockito模拟一个类



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

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。我尝试使用弹簧启动 2.1.1 和 Mockito 2.23.0 运行上述代码

到目前为止,我的观察:

  • 无论我使用2.1.0和2.23.0之间的Mockito版本,例外都是一样的。我不能(也不想(使用旧版本的 Mockito,因为该项目不再编译
  • 如果我暂时删除@Transactional注释,则不会引发异常。

任何想法必须通过弹簧启动的升级进行调整才能再次工作?

谢谢!

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

以前,Mockito剥离了这些注释,这些注释会导致任何真正的方法调用由于缺少事务而失败。

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

相关内容

  • 没有找到相关文章

最新更新