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

如何在单元测试中Mock JOOQ的Record.insert()方法

如何在单元测试中Mock JOOQ Record.insert()方法

假设你用的是Mockito(Java单元测试里最常用的Mock框架),咱们可以按以下步骤来实现,完全避开真实的数据库操作:

  • 第一步:Mock DAO和Record对象
    首先要Mock你的dao.jobComponent实例(也就是JOOQ自动生成的DAO类),还要Mock它的newRecord()方法返回的JobComponentRecord对象——这样我们就能完全掌控这个Record的行为。

  • 第二步:Stub Record的核心方法
    对Mock出来的JobComponentRecord,我们要Stub它的insert()方法,让它啥都不做(或者按需模拟成功/失败场景),同时也可以Stub setter方法来验证参数是否被正确设置。

  • 第三步:把Mock注入到Controller
    把Mock后的DAO注入到待测试的Controller实例里,这样Controller调用dao.jobComponent.newRecord()时,拿到的就是我们预设好的Mock对象。

具体代码示例

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 static org.mockito.Mockito.*;

@ExtendWith(MockitoExtension.class)
public class YourControllerTest {

    // 注入要测试的Controller实例
    @InjectMocks
    private YourController yourController;

    // Mock JOOQ生成的JobComponentDAO
    @Mock
    private JobComponentDao jobComponentDao;

    // Mock JOOQ的JobComponentRecord对象
    @Mock
    private JobComponentRecord jobComponentRecord;

    @Test
    public void createJobComponent_ShouldReturnValidResponse() {
        // 1. 准备测试数据
        Integer testJobId = 1;
        JobComponentPostRequest request = new JobComponentPostRequest();
        request.label = "卧室墙面";
        request.sqFt = 250;

        // 2. 让DAO的newRecord()返回我们Mock的Record
        when(jobComponentDao.newRecord()).thenReturn(jobComponentRecord);

        // 3. Stub Record的setter方法(可选,用来验证参数是否正确传入)
        doNothing().when(jobComponentRecord).setJobId(testJobId);
        doNothing().when(jobComponentRecord).setLabel(request.label);
        doNothing().when(jobComponentRecord).setSqft(request.sqFt);

        // 4. Stub insert()方法,模拟插入操作(这里让它无副作用执行)
        doNothing().when(jobComponentRecord).insert();

        // 5. 调用Controller的目标方法
        JobComponentGetResponse response = yourController.createJobComponent(testJobId, request);

        // 6. 验证关键行为:确保insert()被调用了一次
        verify(jobComponentRecord, times(1)).insert();

        // 额外断言:验证返回结果是否符合预期
        // assertEquals(testJobId, response.getJobId());
        // assertEquals(request.label, response.getLabel());
    }
}

补充说明

  • 如果你的DAO是通过Spring注入的(比如@Autowired),只要用@Mock替代真实DAO实例,再用@InjectMocks注入到Controller里就好。
  • 要是需要测试异常场景(比如插入失败),可以把doNothing()换成doThrow(new SQLException("插入失败")),然后断言Controller是否正确处理了异常。
  • 别忘了在测试依赖里添加Mockito相关包,比如Maven的pom.xml里:
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>4.8.1</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-junit-jupiter</artifactId>
    <version>4.8.1</version>
    <scope>test</scope>
</dependency>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:12:06