编程新手求助:MySpecification类单元测试实现示例
测试MySpecification的示例实现
你可以用JUnit 5 + Mockito来编写测试,针对你的MySpecification,核心测试两种典型场景:request的event不为空和request的event为空的情况,以下是具体实现:
测试依赖说明(若未添加)
确保你的项目依赖中包含JUnit 5和Mockito:
<!-- Maven 依赖示例 --> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>5.9.2</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>5.9.2</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>4.11.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-junit-jupiter</artifactId> <version>4.11.0</version> <scope>test</scope> </dependency>
测试类实现
场景1:request的event不为空时,生成包含event匹配条件的Predicate
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 javax.persistence.criteria.Path; import static org.mockito.Mockito.*; @ExtendWith(MockitoExtension.class) public class MySpecificationTest { @Mock private Root<R> root; @Mock private CriteriaQuery<?> query; @Mock private CriteriaBuilder criteriaBuilder; @Mock private MyRequest request; @Mock private Path<String> eventPath; @Mock private Predicate eventPredicate; @Mock private Predicate combinedPredicate; // 自动注入Mock对象到待测试类 @InjectMocks private MySpecification specification; @Test void toPredicate_WhenEventIsNotEmpty_ShouldAddEventEqualsCondition() { // 模拟request返回非空event String testEvent = "USER_LOGIN"; when(request.getEvent()).thenReturn(testEvent); // 模拟root获取event字段的路径 when(root.get("event")).thenReturn(eventPath); // 模拟criteriaBuilder生成相等匹配的Predicate when(criteriaBuilder.equal(eventPath, testEvent)).thenReturn(eventPredicate); // 模拟criteriaBuilder组合Predicate的结果 when(criteriaBuilder.and(any(Predicate[].class))).thenReturn(combinedPredicate); // 执行测试方法 Predicate result = specification.toPredicate(root, query, criteriaBuilder); // 验证逻辑是否正确执行 verify(root).get("event"); verify(criteriaBuilder).equal(eventPath, testEvent); verify(criteriaBuilder).and(eventPredicate); assert result == combinedPredicate; } }
场景2:request的event为空时,生成空的组合Predicate
@Test void toPredicate_WhenEventIsEmpty_ShouldReturnEmptyCombinedPredicate() { // 模拟request返回空event when(request.getEvent()).thenReturn(""); // 模拟criteriaBuilder处理空Predicate数组的结果 when(criteriaBuilder.and(any(Predicate[].class))).thenReturn(combinedPredicate); // 执行测试方法 Predicate result = specification.toPredicate(root, query, criteriaBuilder); // 验证不需要的逻辑未被触发 verify(root, never()).get("event"); verify(criteriaBuilder, never()).equal(any(Path.class), anyString()); // 验证空组合逻辑被执行 verify(criteriaBuilder).and(new Predicate[0]); assert result == combinedPredicate; }
测试核心要点
- 用
@ExtendWith(MockitoExtension.class)启用Mockito的JUnit 5支持 @InjectMocks自动将Mock对象注入到待测试的MySpecification实例- 每个测试只聚焦一个场景,通过模拟依赖行为,验证目标方法的逻辑分支是否正确
- 用
verify确认Mock对象的方法调用情况,确保逻辑符合预期
内容的提问来源于stack exchange,提问作者Marzepanio Tortus
相关产品推荐
相关产品推荐

