Panache仓库单元测试count未返回1致断言失败问题排查
问题解决:Quarkus PanacheRepository 测试中count方法Mock不生效导致断言失败
问题核心
测试BookRepositoryImpl的existsBookByIsbn方法时,期望count返回1从而让方法返回true,但Mock的count方法未生效,始终返回0,导致断言失败。
原因分析
count是PanacheRepository父类的方法,直接Mock实现类(BookRepositoryImpl)时,默认不会正确Mock父类的方法:
- 第一个测试中,Mock对象的父类
count方法未被正确拦截,默认返回long类型的默认值0; - 第二个测试中,父类的
find方法同样未被正确Mock,返回null,后续调用query.count()自然无法得到预期值。
可行解决方案
方案1:使用Spy替代Mock,Mock父类方法
Spy会保留真实实例的行为,仅Mock指定方法,适合这种需要调用真实业务逻辑、仅Mock父类依赖方法的场景:
@QuarkusTest class BookRepositoryImplTest { @Inject @Spy private BookRepositoryImpl bookRepositoryImpl; private static final String DEFAULT_STRING = "TEST"; private static final long LONG_1 = 1L; @Test void existsBookByIsbn_TRUE() { // 使用doReturn直接指定返回值,避免触发原方法调用 doReturn(LONG_1).when(bookRepositoryImpl).count(eq("isbn"), eq(DEFAULT_STRING)); boolean result = bookRepositoryImpl.existsBookByIsbn(DEFAULT_STRING); assertTrue(result); } }
方案2:使用测试数据库进行真实验证
放弃Mock,直接用Quarkus提供的嵌入式测试数据库插入数据,验证业务逻辑的正确性,这种方式更贴近生产环境:
@QuarkusTest @Transactional class BookRepositoryImplTest { @Inject private BookRepositoryImpl bookRepositoryImpl; private static final String TEST_ISBN = "TEST"; @Test void existsBookByIsbn_TRUE() { // 插入测试数据 Book book = new Book(); book.setIsbn(TEST_ISBN); book.persist(); // 验证方法返回值 boolean result = bookRepositoryImpl.existsBookByIsbn(TEST_ISBN); assertTrue(result); } }
内容的提问来源于stack exchange,提问作者vsolon
相关产品推荐
相关产品推荐

