You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Panache仓库单元测试count未返回1致断言失败问题排查

问题解决:Quarkus PanacheRepository 测试中count方法Mock不生效导致断言失败

问题核心

测试BookRepositoryImpl的existsBookByIsbn方法时,期望count返回1从而让方法返回true,但Mock的count方法未生效,始终返回0,导致断言失败。

原因分析

count是PanacheRepository父类的方法,直接Mock实现类(BookRepositoryImpl)时,默认不会正确Mock父类的方法:

  1. 第一个测试中,Mock对象的父类count方法未被正确拦截,默认返回long类型的默认值0;
  2. 第二个测试中,父类的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 21:17:28