我正在使用 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
豆子?
当在 Spring Bean 上使用
@SpringSpy
且 Spring 已经在代理时,您需要解开该代理。这是通过 @UnwrapAopProxy
完成的
@UnwrapAopProxy
@SpringSpy
MyJpaRepository repo
void "spying on a repo works"() {
when:
repo.getById(1L)
then:
1 * repo.getById(_)
}
评论中提到了这一点,但没有人提交答案,我花了很多时间试图找到答案,因为我第一次登陆这里时没有阅读评论。
这篇博文也非常有帮助。如果您担心重用 Spring 上下文,以免测试速度变慢,那么您可能需要考虑本文中介绍的其他选项。