Mock常用方法

http://www.tuicool.com/articles/J7BFr2A

Mock 测试是单元测试的重要方法之一。Mockito是基于Java的Mock测试框架。
什么是 Mock 测试
Mock 测试就是在测试过程中,对于某些不容易构造(如 HttpServletRequest 必须在Servlet 容器中才能构造出来)或者不容易获取比较复杂的对象(如 JDBC 中的ResultSet 对象),用一个虚拟的对象(Mock 对象)来创建以便测试的测试方法。
Mock可以帮我们把单元测试的耦合分解开,如果代码对另一个类或者接口有依赖,它能够帮我们模拟这些依赖,并帮验证所调用的依赖的行为。
Mock 对象使用范畴
真实对象具有不可确定的行为,产生不可预测的效果,真实对象很难被创建的 真实对象的某些行为很难被触发 真实对象实际上还不存在的(和其他开发小组或者和新的硬件打交道)等等.
示例
1.验证行为
//Let’s import Mockito statically so that the code looks clearer
import static org.mockito.Mockito.*;
//mock creation
List mockedList = mock(List.class);
//using mock object
mockedList.add(“one”);
mockedList.clear();
//verification
verify(mockedList).add(“one”);
verify(mockedList).clear();
一旦创建 mock 将会记得所有的交互。你可以选择验证你感兴趣的任何交互
2.stubbing
//You can mock concrete classes, not just interfaces
LinkedList mockedList = mock(LinkedList.class);
//stubbing
when(mockedList.get(0)).thenReturn(“first”);
when(mockedList.get(1)).thenThrow(new RuntimeException());
//following prints “first”
System.out.println(mockedList.get(0));
//following throws runtime exception
System.out.println(mockedList.get(1));
//following prints “null” because get(999) was not stubbed
System.out.println(mockedList.get(999));
• Stubbing 可以被覆盖。最后的 stubbing 是很重要的
• 一旦 stub,该方法将始终返回一个 stub 的值,无论它有多少次被调用。
3.调用额外的调用数字/at least x / never
//using mock
mockedList.add(“once”);
mockedList.add(“twice”);
mockedList.add(“twice”);
//following two verifications work exactly the same - times(1) is used by default
verify(mockedList).add(“once”);
verify(mockedList, times(1)).add(“once”);
//exact number of invocations verification
verify(mockedList, times(2)).add(“twice”);
//verification using never(). never() is an alias to times(0)
verify(mockedList, never()).add(“never happened”);
times(1) 是默认的,因此,使用的 times(1) 可以显示的省略。
4.Stubbing void 方法处理异常
doThrow(new RuntimeException()).when(mockedList).clear();
//following throws RuntimeException:
mockedList.clear();
5. 标准创建 mock 方式 - 使用 @Mock 注解
最小化可重用 mock 创建代码,使测试类更加可读性,使验证错误更加易读,因为字段名称用于唯一识别 mock
public class ArticleManagerTest {
@Mock private ArticleCalculator calculator;
@Mock private ArticleDatabase database;
在基础类或者测试 runner 里面,使用如下:
MockitoAnnotations.initMocks(testClass);
6. Stubbing 连续调用(迭代器式的 stubbing)
when(mock.someMethod(“some arg”))
.thenReturn(“one”, “two”, “three”);
7. doReturn()|doThrow()| doAnswer()|doNothing()|doCallRealMethod() 家族方法

引用\[1\]中提到了在测试中使用Mock的步骤。首先,需要从testing名称空间导入gmock.h的函数名。然后,创建一些Mock对象,并指定对它们的期望,例如方法将被调用多少次、带有什么参数、每次应该做什么以及返回什么值等等。接下来,可以使用Mock对象,并使用googletest断言检查结果。如果mock函数的调用超出预期或参数错误,将会立即收到错误信息。最后,当Mock对象被销毁时,gmock会自动检查对模拟的所有期望是否得到满足。 引用\[2\]是一个使用Gmock进行测试的示例。在这个示例中,使用了NiceMock来创建一个mock_message_dao对象和一个mock_http_request对象。然后,设置了对mock_requester的期望,包括每次调用都执行的行为和返回值。接下来,创建了一个chat_room对象,并通过constructor注入了mock对象。最后,使用EXPECT_EQ断言来验证调用cr.log()的结果是否为"response"。 引用\[3\]提到了Gmock是C++中的一个接口测试框架,通常与Google Test搭配使用。它提供了基础常用的用法,如果需要特殊用法,可以查阅Google Mock官方文档。 根据提供的引用内容,关于gtest mock的问题,可以回答如下: gtest mock是Google Test中的一个模块,用于创建和管理Mock对象,以便进行接口测试。它提供了一些函数和宏,用于设置对Mock对象的期望,并可以使用googletest断言来验证这些期望是否得到满足。通过使用gtest mock,可以模拟接口的行为,使得测试更加灵活和可控。 #### 引用[.reference_title] - *1* *2* *3* [【单元测试】Google Test(GTest)和Google Mock(GMock)--编辑中](https://blog.csdn.net/weixin_42319496/article/details/125942816)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值