各位大师,有个问题,在写单元测试时发现业务逻辑中.有一段是这种写法
if(item.getId()==null){
mapper.insert(item);
String newId=item.getId();
if(newId!=null){
……
}
}
这种id来自于自增处理,我在模拟时如何能补充这个id,让他能够继续执行后续逻辑呢
mock模拟insert请求 junit4mockito.java.ft
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
3条回答 默认 最新
- woc ??? 2024-01-19 20:09关注
在使用 Mockito 进行单元测试时,如果需要模拟自增 ID 的行为,你可以使用
thenAnswer
方法,通过一个自定义的Answer
对象来处理。假设你有一个
ItemMapper
接口和对应的ItemService
服务,可以按照以下方式来模拟自增 ID 的行为:import static org.mockito.Mockito.*; public class ItemServiceTest { @Test public void testInsertWithGeneratedId() { // 创建一个 mock 的 ItemMapper ItemMapper itemMapper = mock(ItemMapper.class); // 创建一个 ItemService,并将 mock 的 ItemMapper 注入 ItemService itemService = new ItemService(itemMapper); // 创建一个 Item 对象,这里不设置 ID Item item = new Item(); item.setName("Example Item"); // 模拟插入操作,并设置 Answer 来模拟生成自增 ID when(itemMapper.insert(any(Item.class))).thenAnswer(new Answer<Integer>() { private int idCounter = 1; @Override public Integer answer(InvocationOnMock invocation) throws Throwable { Item insertedItem = invocation.getArgument(0); insertedItem.setId(idCounter++); // 模拟生成自增 ID return 1; // 假设插入成功 } }); // 调用业务逻辑 itemService.insertItem(item); // 验证插入是否被调用 verify(itemMapper, times(1)).insert(any(Item.class)); // 验证后续逻辑,可以根据实际情况进行具体验证 // ... // 可以通过 item.getId() 获取模拟生成的自增 ID assertNotNull(item.getId()); System.out.println("Generated ID: " + item.getId()); } }
在这个例子中,我们使用
thenAnswer
方法来设置ItemMapper.insert
方法的行为。Answer
接口允许我们编写一段逻辑,来模拟方法调用的返回值。不过呢。。这只是一个示例,实际情况可能需要根据你的业务逻辑和具体情况进行调整。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用
悬赏问题
- ¥15 有偿求跨组件数据流路径图
- ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
- ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
- ¥15 CSAPPattacklab
- ¥15 一直显示正在等待HID—ISP
- ¥15 Python turtle 画图
- ¥15 关于大棚监测的pcb板设计
- ¥15 stm32开发clion时遇到的编译问题
- ¥15 lna设计 源简并电感型共源放大器
- ¥15 如何用Labview在myRIO上做LCD显示?(语言-开发语言)