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

如何为Spring Boot中使用EntityManager的类的createTypedQuery方法编写单元测试

单元测试实现方案

你这个类的核心依赖是注入的EntityManager,单元测试不需要启动Spring/持久化上下文,直接用Mockito框架mock依赖即可,步骤如下:

1. 引入测试依赖

首先确保项目中引入Mockito和JUnit相关依赖,以Maven为例:

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>4.11.0</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <version>5.9.2</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-junit-jupiter</artifactId>
    <version>4.11.0</version>
    <scope>test</scope>
</dependency>

2. 编写测试代码

以下是JUnit5 + Mockito的完整测试示例:

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import jakarta.persistence.EntityManager;
import jakarta.persistence.TypedQuery;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;

@ExtendWith(MockitoExtension.class)
public class ATest {

    // Mock 依赖的EntityManager实例
    @Mock
    private EntityManager entityManager;

    // 将mock的EntityManager注入到测试目标类A的实例中
    @InjectMocks
    private A a;

    @Test
    public void testCreateTypedQuery() {
        // 准备测试参数
        String testQuery = "SELECT u FROM User u WHERE u.id = :id";
        Class<User> resultType = User.class;
        // Mock 要返回的TypedQuery实例
        TypedQuery<User> mockQuery = mock(TypedQuery.class);

        // 定义mock方法的返回逻辑
        when(entityManager.createQuery(testQuery, resultType)).thenReturn(mockQuery);

        // 调用目标方法
        TypedQuery<User> result = a.createTypedQuery(testQuery, resultType);

        // 断言返回结果正确
        assertNotNull(result);
        assertEquals(mockQuery, result);
        // 验证entityManager的createQuery方法确实被调用,且参数和传入的一致
        verify(entityManager, times(1)).createQuery(testQuery, resultType);
    }

    // 测试用的POJO,可替换为你实际的实体类
    static class User {
        private Long id;
        // 省略getter/setter
    }
}

3. 测试逻辑说明

  • 整个测试不需要启动容器,执行速度极快,完全符合单元测试的隔离性要求
  • 核心验证点有两个:一是目标方法确实正确调用了EntityManager的对应方法,传参没有错误;二是返回值和EntityManager返回的TypedQuery完全一致
  • 如果你用的是JUnit4,只需要把类上的@ExtendWith(MockitoExtension.class)替换为@RunWith(MockitoJUnitRunner.class)即可,其余逻辑基本一致
  • 如果你的项目使用的是Java EE版本的持久化API,把import中的jakarta.persistence替换为javax.persistence即可

内容的提问来源于stack exchange,提问作者kalipts

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 10:54:04