如何在Quarkus测试中Mock Panache的persist方法?
解决Quarkus测试中Mock Panache .persist()方法的问题
方案一:使用Quarkus内置PanacheMock工具
Quarkus提供了专门适配Panache的PanacheMock,是Mock实体静态方法(比如persist())的最优方案:
- 测试类标注
@QuarkusTest注解 - 用
PanacheMock.mock(目标实体类.class)开启Mock - 结合Mockito定义
persist()的行为
示例代码:
import io.quarkus.test.junit.QuarkusTest; import io.quarkus.test.junit.mockito.PanacheMock; import org.junit.jupiter.api.Test; import static org.mockito.Mockito.*; @QuarkusTest public class EntityServiceTest { @Test void testPersistMock() { // Mock目标实体类 PanacheMock.mock(UserEntity.class); // 定义persist()执行时无操作(模拟成功) doNothing().when(UserEntity.class); UserEntity.persist(any(UserEntity.class)); // 调用被测试的服务方法 userService.createUser(new UserEntity("test")); // 验证persist()是否被调用过一次 verify(UserEntity.class, times(1)).persist(any(UserEntity.class)); } }
方案二:Mock PanacheRepository(依赖注入场景)
如果业务代码依赖PanacheRepository接口而非直接调用实体静态方法,可通过@InjectMock替换真实实现:
- 定义你的
PanacheRepository接口 - 在测试类中注入Mock版本的Repository
- 定义
persist()的Mock行为
示例代码:
import io.quarkus.test.junit.QuarkusTest; import io.quarkus.test.junit.mockito.InjectMock; import org.junit.jupiter.api.Test; import static org.mockito.Mockito.*; @QuarkusTest public class EntityServiceTest { @InjectMock UserRepository mockUserRepo; @Inject UserService userService; @Test void testPersistWithMockRepo() { // 让persist()无操作执行 doNothing().when(mockUserRepo).persist(any(UserEntity.class)); userService.createUser(new UserEntity("test")); // 验证Repository的persist()被调用 verify(mockUserRepo, times(1)).persist(any(UserEntity.class)); } } // 定义Repository接口 public interface UserRepository extends PanacheRepository<UserEntity> {}
常见问题排查
- 必须引入
io.quarkus:quarkus-junit5-mockito依赖,原生Mockito无法适配Quarkus的CDI代理机制 - Mock实体静态方法时,必须用
PanacheMock.mock(),不能用普通的Mockito.mock() - 验证静态方法调用时,要以实体类作为验证对象,而非实体实例
内容的提问来源于stack exchange,提问作者Landister
相关产品推荐
相关产品推荐

