单元测试使用Mock随笔
@RunWith(MockitoJUnitRunner.class) public class UserServiceTest { @Spy @InjectMocks private UserServiceImpl userService; @Mock private UserMapper userMapper; @Mock private UserAddressService userAddressService; @Test public void saveOrUpdateTest() { try { when(userAddressService.check(any())).thenReturn(true); when(userService.remove(any())).thenReturn(true); doNothing().when(userMapper).setUTF8MB4(); boolean result = userService.saveOrUpdate(null, null); System.out.println(); } catch (Exception ex) { ex.printStackTrace(); } Assert.assertTrue(true); } }
@InjectMocks:是直接实例化一个对象,且可以实现自动注入,注入的对象就是@Mock或@Spy注解的对象
@Mock:Mock出的对象,执行对象方法会返回Null,可以通过when().thenReturn方式或者doReturn().when().方法的方式指定返回值。
如果对象方法是void的形式的,需要使用doNothing().when形式
@Spy:实例化的对象会优先执行原有方法,如果想得到指定结果,则使用doReturn when形式。
在MybatisPlus中和@InjectMocks配合使用,便可实现拦截处理封装好的this.remove等类似方法
MyBatisPlus中Wrappers.lambdaQuery会使用到select某些指定字段的方法,此过程涉及到了MyBatisPlus需要初始化数据库表和实体类关系,否则无法生成select语句。
在Mock中需要添加如下代码,否则报错:com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: can not find lambda cache for this entity
@Before public void init() { TableInfoHelper.initTableInfo(new MapperBuilderAssistant(new MybatisConfiguration(), ""), CorpUserEntity.class); }
如果需要注入属性字段,如Spring中靠@Value注解的,可以直接使用反射赋值
ReflectionTestUtils.setField(targetObject, "secret", "aasdfasdfe");
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架