Mockito 测试框架
官方网站
什么是Mock 测试
Mock 测试就是在测试过程中,对于某些不容易构造(如 HttpServletRequest 必须在Servlet 容器中才能构造出来)或者不容易获取的对象(如 JDBC 中的ResultSet 对象,JPA的CRUDRepository,需要执行数据库操作的),用一个虚拟的对象(Mock 对象)来创建(覆盖方法返回)以便测试的测试方法。
JUnit 是一个单元测试框架。
Mockito 是用于数据模拟对象的框架。
@InjectMocks、@Spy、@Mock之间的区别
@InjectMocks:创建一个实例,简单的说是这个Mock可以调用真实代码的方法,其余用@Mock(或@Spy)注解创建的mock将被注入到用该实例中。
@Mock:对函数的调用均执行mock(即虚假函数),不执行真正部分。
@Spy:对函数的调用均执行真正部分。
mockito之@Mock和@InjectMock
@Mock创建的是全部mock的对象,既在对具体的方法打桩之前,mock对象的所有属性和方法全被置空(0或者null);与之对应的是@Spy这个注解,@Spy可以创建部分mock的对象,部分mock对象的所有成员方法都会按照原方法的逻辑执行,直到被打桩返回某个具体的值。@Mock和@Spy才是两个具有可比性的概念。
Mokcito的mock()方法功能与@Mock相同,只是使用方式和场景不同。同样的,@Spy也对应一个spy()方法。
@Mock和@Spy注解的对象,均可被@InjectMock注入到待处理的对象中。
@Mock与@InjectMocks的区别
@Mock: 创建一个Mock.
@InjectMocks: 创建一个实例,简单的说是这个Mock可以调用真实代码的方法,其余用@Mock(或@Spy)注解创建的mock将被注入到用该实例中。
注意:必须使用@RunWith(MockitoJUnitRunner.class) 或 Mockito.initMocks(this)进行mocks的初始化和注入。
初始化
@BeforeMethod public void init() { //初始化 MockitoAnnotations.initMocks(this); //复杂对象,通过反射设置 ReflectionTestUtils.setField(orderFactory, "valueBuilder", valueBuilder); }
使用Mocktio注入对象的时候,存在需要注入依赖对象的情况,此时可以使用@InjectMocks或者使用spring提供的ReflectionUtils进行处理
@InjectMocks private OrderHandler orderHandler; @Mock private OrderFactory orderFactory; @Mock private ValueObjectBuilder valueObjectBuilder; @BeforeMethod public void init() { MockitoAnnotations.initMocks(this); ReflectionTestUtils.setField(orderFactory, "valueObjectBuilder", valueObjectBuilder); } //上面的情况是OrderFactory内部依赖ValueObjectBuilder,OrderHandler内部依赖OrderFactory,需要先将ValueObjectBuilder、OrderFactory Mock出来,然后在初始化方法中 //通过反射将valueObjectBuilder设置给orderFactory,然后orderHandler因为使用InjectMocks注解,会将依赖的属性orderFactory自动注入
JUnit+Mockito单元测试之打桩
when().thenReturn();
Stub 打桩
迭代打桩
-------------------------------------------
个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
2019-07-17 自定义异常以及异常的处理