如何在单元测试中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
相关产品推荐
相关产品推荐

