如何将 spock @SpringSpy 与 JpaRepository 一起使用

问题描述 投票:0回答:1

我正在使用 spring boot 和 jpa 和 spock。我想断言对存储库进行了某些调用作为功能测试,因此模拟不起作用(我需要验证本机查询是否适用于数据库中的某些测试数据)。

我已经尝试了

@SpringBootTest
与字段:

@SpringSpy
MyJpaRepository repo

并且在测试方法内:

interaction {
        1 * repo.someMethod(_) 
}

哪里

MyJpaRepository extends JpaRepository<Foo, Long>
,但是当我运行测试时我得到:

无法为 com.sun.proxy.$Proxynnn 类创建模拟,因为 Java 模拟无法模拟最终类。如果被测代码是用 Groovy 编写的,请使用 Groovy 模拟。

除了这个错误,我所有的功能测试都有效,所以这不是配置问题。

我如何监视

@Autowired
豆子?

java spring-boot testing spock spy
1个回答
0
投票

当在 Spring Bean 上使用

@SpringSpy
且 Spring 已经在代理时,您需要解开该代理。这是通过
@UnwrapAopProxy

完成的
@UnwrapAopProxy
@SpringSpy
MyJpaRepository repo

void "spying on a repo works"() {
  when:
  repo.getById(1L)

  then:
  1 * repo.getById(_)
}

评论中提到了这一点,但没有人提交答案,我花了很多时间试图找到答案,因为我第一次登陆这里时没有阅读评论。

这篇博文也非常有帮助。如果您担心重用 Spring 上下文,以免测试速度变慢,那么您可能需要考虑本文中介绍的其他选项。

© www.soinside.com 2019 - 2024. All rights reserved.