如何为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
相关产品推荐
相关产品推荐

