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

编程新手求助: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 16:15:41