当前位置: 首页 > 知识库问答 >
问题:

Mockito无法创建@Autowired Spring数据存储库的Spy

韩乐湛
2023-03-14

我试图覆盖我的整个测试环境与Mockito.spy功能,所以每当我想我可以存根一个方法,但所有其他调用去默认功能。这在服务层运行得很好,但是我在存储库层有问题。

我的设置如下:

Mockito-2.15.0 Spring-5.0.8 SpringBoot-2.0.4

存储库:

public interface ARepository extends CrudRepository<ADBO, Long> {}

服务:

@Service
public class AService {

    @Autowired
    ARepository aRepository;

    public ADBO getById(long id) {
        return aRepository.findById(id).orElse(null);
    }

    public Iterable<ADBO> getAll() {
        return aRepository.findAll();
    }
}

spy的配置:

@Profile("enableSpy")
@Configuration
public class SpyConfig {

    @Bean
    @Primary
    public ARepository aRepository() {
        return Mockito.spy(ARepository.class);
    }
}

还有我的测试课:

@ActiveProfiles("enableSpy")
@RunWith(SpringRunner.class)
@SpringBootTest
public class AServiceTest {

    @Autowired
    AService aService;

    @Autowired
    ARepository aRepository;

    @Test
    public void test() {
        ADBO foo = new ADBO();
        foo.setTestValue("bar");
        aRepository.save(foo);

        doReturn(Optional.of(new ADBO())).when(aRepository).findById(1L);
        System.out.println("result (1):" + aService.getById(1));

        System.out.println("result all:" + aService.getAll());

    }
}

现在,该测试有三种可能的结果:

>

aRepository是间谍(这就是我想要的):
result(1):ADBO(id=null,testValue=null)result all:[ADBO(id=1,testValue=bar)]

我将此行为归因于以下事实:存储库的spring实例化在后台更加复杂,并且在调用Mockito时存储库没有正确实例化。间谍(ARepository.class)

我还尝试将正确的实例自动添加到Configuration中,并使用@autowmed对象调用Mockito.spy()

这导致:

Cannot mock/spy class com.sun.proxy.$Proxy75
Mockito cannot mock/spy because :
 - final class

根据我的研究,Mockito可以从v2开始模拟和监视最终类。0.0.

调用Mockito。模拟细节(假设性)。isSpy()返回true,这让我觉得后台的对象没有正确实例化。

最后我的问题:

如何在我的UnitTest中使用@autowmed获得Spring数据存储库的间谍实例?

共有2个答案

司马建柏
2023-03-14

自Spring引导版本2.5.3以来,@SpyBean现在可以使用Spring数据存储库

如果无法升级,可以通过在测试方法主体中实例化spy来解决此问题:

var yourSpy = Mockito.mock(FooRepository.class, AdditionalAnswers.delegatesTo(real))
白泽语
2023-03-14

更新08/2021

您应该使用@SpyBean

它以前是坏的(参见下面问题的链接),但现在它已经被修复,并且从Spring Boot2.5开始就得到了支持。3

如果仍然出现此错误,并且无法更新Spring Boot版本,您可能希望尝试解决@Mateusz Zając在这个问题的一个答案中提出的问题。(请考虑他的回答,如果它对你有用)

链接到(关闭)问题:http://github.com/spring-projects/spring-boot/issues/7033

 类似资料:
  • 问题内容: 我正在尝试调用从pyodbc创建数据库的存储过程 以下是代码的最小示例 理想情况下,该代码应在SQL Server实例中创建一个名为“ Test ”的数据库。这不会产生任何错误。但是没有创建数据库。 跑步 问题答案: Python DB API2.0指定默认情况下,应在禁用自动提交的情况下打开连接。但是,许多数据库要求DDL语句 不在 事务内执行。尝试在禁用自动提交的情况下执行DDL语

  • 经过安装Spring屋顶的痛苦。我正在尝试创建一个项目。然而,在通过spring shell创建了pojo之后,我现在正在创建spring存储库。我运行了以下命令来创建POJO 到目前为止一切都很好,但麻烦来了: 我立刻得到这个消息——实体选项应该是一个实体。我被卡住了。我尝试删除pojo并运行以下命令: 我得到的消息是:< code >“选项‘test automatically’,‘activ

  • 我正在尝试从 Azure 机器学习工作室内部连接到 Azure SQL 数据库。根据 https://docs.microsoft.com/en-us/python/api/azureml-core/azureml.core.datastore.datastore?view=azure-ml-py,建议的模式似乎是使用Datastore.register_azure_sql_database方法创

  • 主要内容:创建一个远程存储库在本章中,我们将看到如何创建一个远程Git仓库; 我们需要一个远程Git仓库来执行团队协作。这一篇文章很重要,直接影响到后面的章节的学习。所以,希望大家可先耐心地看完本章内容,并按本章一步步的操作。 创建一个远程存储库 我们将演示在 http://git.oschina.net/ 软件项目的托管平台上创建和初始化一个新的存储库。 注:你也可以使用 GitHub (http://github.com

  • 我最近从使用预填充的DB切换到允许Hibernate创建我的表。当试图在我的data.sql中创建存储过程时,我得到以下错误: 我已经尝试添加

  • 并将其添加到主存储库: 启动应用程序时,出现以下错误: 原因:org.SpringFramework.Data.Mapping.PropertyReferenceException:未找到类型Friends的属性findFriends!在org.springframework.data.mapping.propertypath.(propertypath.java:77)在org.springfr