Features (OCMock 2)
This page describes the features present in OCMock 2.x, using the traditional syntax. All these features, including the selector-based syntax, are available in OCMock 3, too. However, starting with OCMock 3 the default is the modern syntax, described on the new reference page.
Class mocks
id mock = [OCMockObject mockForClass:[SomeClass class]]
Creates a mock object that can be used as if it were an instance of SomeClass.
Expectations and verification
[[mock expect] someMethod:someArgument]
Tells the mock object that someMethod: should be called with an argument that is equal to someArgument. After this setup the functionality under test should be invoked followed by
[mock verify]
The verify method will raise an exception if the expected method has not been invoked.
In some cases the expected method will only be called when the run loop is active. For these cases it is possible to delay the verification for a while.
[mock verifyWithDelay:aDelay]
Note that aDelay is the maximum the mock will wait. It normally returns as soon as the expectation has been met.
Stubs
[[[mock stub] andReturn:aValue] someMethod:someArgument]
Tells the mock object that when someMethod: is called with someArgument it should return aValue.
If the method returns a primitive type then andReturnValue: must be used with a value argument. It is not possible to pass primitive types directly.
[[[mock stub] andReturnValue:@YES] aMethodReturnABoolean:someArgument]
Values can also be returned in pass-by-reference arguments:
[[mock stub] someMethodWithReferenceArgument:[OCMArg setTo:anObject]]
[[mock stub] someMethodWithReferenceArgument:[OCMArg setToValue:OCMOCK_VALUE((int){aValue})]]
In this case the mock object will set the reference that is passed to the method to anObject and aValue.
The mock object can also throw an exception or post a notification when a method is called:
[[[mock stub] andThrow:anException] someMethod:someArgument]
[[[mock stub] andPost:aNotification] someMethod:someArgument]
In fact, the notification can be posted in addition to returning a value:
[[[[mock stub] andPost:aNotification] andReturn:aValue] someMethod:someArgument]
The mock can delegate the handling of an invocation to a completely different method:
[[[mock stub] andCall:@selector(aMethod:) onObject:anObject] someMethod:someArgument]
In this case the mock object will call aMethod: on anObject when someMethod: is called. The signature of the replacement method must be the same as that of the method that is replaced. Arguments will be passed and the return value of the replacement method is returned from the stubbed method.
If Objective-C blocks are available a block can be used to handle the invocation and set up a return value:
void (^theBlock)(NSInvocation *) = ^(NSInvocation *invocation) {
/* code that reads and modifies the invocation object */
};
[[[mock stub] andDo:theBlock] someMethod:[OCMArg any]];
If using a partial mock (see below) it is possible to forward the method to the implementation in the real object, which can be useful to simply check that a method was called:
[[[mock expect] andForwardToRealObject] someMethod]
Note that it is possible to use andReturn:, andThrow:, etc with expect, too. This will then return the given return value and, on verify, ensure that the method has been called.
Class methods
[[[mock stub] andReturn:aValue] someClassMethod]
Tells the mock object that when someClassMethod is called on the class for which the mock object was created it should return aValue. This is the same syntax that is used to stub instance methods.
As with partial mocks it is possible to use andForwardToRealObject to invoke the actual class method implementation.
[[[mock expect] andForwardToRealObject] someClassMethod]
In cases where a class method should be stubbed but the class also has an instance method with the same name as the class method, the intent to mock the class method must be made explicit:
[[[[mock stub] classMethod] andReturn:aValue] aMethod]
The class can be returned to its original state, i.e. all stubs will be removed:
[mock stopMocking]
This is only necessary if the original state must be restored before the end of the test. The mock automatically callsstopMocking during its own deallocation.
Note: If the mock object that added a stubbed class method is not deallocated the stubbed method will persist across tests. If multiple mock objects manipulate the same class at the same time the behaviour is undefined.
Argument constraints
[[mock expect] someMethod:[OCMArg any]]
Tells the mock object that someMethod: should be called and it does not matter what the argument is. This only works for object arguments.
Pointers and selectors require special treatment:
[[mock expect] someMethodWithPointerArgument:[OCMArg anyPointer]]
[[mock expect] someMethodWithSelectorArgument:[OCMArg anySelector]]
Arguments that are neither objects nor pointers or selectors cannot be ignored using an any placeholder (for details see thisforum thread). It is possible, though, to tell the mock to ignore all non-object arguments in an invocation:
[[[mock expect] ignoringNonObjectArgs] someMethodWithIntArgument:0]
In this case the mock will accept any invocation of someMethodWithIntArgument: no matter what argument is actually passed. If the method has object arguments as well as non-object arguments, the object arguments can still be constrained as usual using the methods on OCMArg.
Other constraints available for object arguments are:
[[mock expect] someMethod:[OCMArg isNil]]
[[mock expect] someMethod:[OCMArg isNotNil]]
[[mock expect] someMethod:[OCMArg isNotEqual:aValue]]
[[mock expect] someMethod:[OCMArg checkWithSelector:aSelector onObject:anObject]]
The last constraint will, when the mock object receives someMethod:, send aSelector to anObject and if aSelector takes an argument will pass the argument that was passed to someMethod:. The method should return a boolean indicating whether the argument matched the expectation or not.
If Objective-C blocks are available it is possible to check the argument with a block as follows:
[[mock expect] someMethod:[OCMArg checkWithBlock:^BOOL(id value) { /* return YES if value is ok */ }]];
Last but not least it is also possible to use Hamcrest matchers like this:
[[mock expect] someMethod:startsWith(@"foo")]
Note that this will only work when the Hamcrest framework is explicitly linked by the unit test bundle.
Nice mocks / failing fast
When a method is called on a mock object that has not been set up with either expect or stub the mock object will raise an exception. This fail-fast mode can be turned off by creating a "nice" mock:
id mock = [OCMockObject niceMockForClass:[SomeClass class]]
While nice mocks will simply ignore all unexpected methods it is possible to disallow specific methods:
[[mock reject] someMethod]
Note that in fail-fast mode, if the exception is ignored, it will be rethrown when verify is called. This makes it possible to ensure that unwanted invocations from notifications etc. can be detected.
Protocol mocks
id aMock = [OCMockObject mockForProtocol:@protocol(SomeProtocol)]
Creates a mock object that can be used as if it were an instance of an object that implements SomeProtocol.
Partial mocks
id aMock = [OCMockObject partialMockForObject:anObject]
Creates a mock object that can be used in the same way as anObject. When a method that is not stubbed is invoked it will be forwarded to anObject. When a stubbed method is invoked using a reference to anObject, rather than the mock, it will still be handled by the mock.
The real object can be returned to its original state, i.e. all stubs will be removed:
[aMock stopMocking]
This is only necessary if the original state must be restored before the end of the test. The partial mock automatically callsstopMocking during its own deallocation.
Note that currently partial mocks cannot be created for instances of toll-free bridged classes, e.g. NSString.
Observer mocks
id aMock = [OCMockObject observerMock]
Creates a mock object that can be used to observe notifications. The mock must be registered in order to receive notifications:
[notificatonCenter addMockObserver:aMock name:SomeNotification object:nil]
Expectations can then be set up as follows:
[[mock expect] notificationWithName:SomeNotification object:[OCMArg any]]
Note that currently there is no "nice" mode for observer mocks, they will always raise an exception when an unexpected notification is received.
Instance-based method swizzling
In a nutshell, Method Swizzling describes the replacement of a method implementation with a different implementation at runtime. Using partial mocks and the andCall: stub OCMock allows such replacements on a per-instance basis.
id mock = [OCMockObject partialMockForObject:anObject]
[[[mock stub] andCall:@selector(differentMethod:) onObject:differentObject] someMethod:[OCMArg any]]
After these two lines, when someMethod: is sent to anObject the implementation of that method is not invoked. Instead,differentMethod: is called on differentObject. Other instances of the same class are not affected; for these the original implementation of someMethod: is still invoked. The methods can have different names but their signatures should be the same.
More detail
The test cases in OCMockObjectTests and OCMockObjectHamcrestTests show all uses of OCMock.
Changes.txt contains a chronological list of all changes.
Features (OCMock 2)的更多相关文章
- iOS单元測试:Specta + Expecta + OCMock + OHHTTPStubs + KIF
框架选择 參考这篇选型文章,http://zixun.github.io/blog/2015/04/11/iosdan-yuan-ce-shi-xi-lie-dan-yuan-ce-shi-kuang ...
- Specific sleep staging features in EEG
Source: MedScape Overview NREM and REM occur in alternating cycles, each lasting approximately 90-10 ...
- ECMAScript 6 Features 中文版
ECMAScript 6 Features 中文版 如词不达意,欢迎提 PR & issue 采用中英混排的方式进行译制,如不解请查看对应原文 本文档将与原作者的 文档 保持同步更新,欢迎关注 ...
- New Features In SNMPv3 - SNMP Tutorial
30.12 New Features In SNMPv3 We said that version 3 of SNMP represents an evolution that follows and ...
- 自然语言27_Converting words to Features with NLTK
https://www.pythonprogramming.net/words-as-features-nltk-tutorial/ Converting words to Features with ...
- IOS单元测试,OCMock
1.环境搭建 使用官方推荐,手动搭建.. 1.下载所需文件 http://ocmock.org/download/ 根据自己的需要下载不同的版本. 打开iOS library文件夹,里面就有需要用到的 ...
- Android真机调试 Android.Util.AndroidRuntimeException: You cannot combine custom titles with other title features
参考连接:http://blog.csdn.net/scyatcs/article/details/9003285 Android.Util.AndroidRuntimeException: You ...
- [Android Tips] 22. Available Java 7 Features in Android
This only allows Java 7 language features, and you can hardly benefit from anything since a half of ...
- ASP.NET features need application service database support
搭建的web程序出现如上图所示的错误 原因程序使用以下ASP.NET 特性 Membership (the SqlMembershipProvider class). Role management ...
随机推荐
- update-database -script
update-database -script 更新脚本生成失败? 项目选择的不对 update后面-database空格-script
- Mifare简介
Mifare简介 MIFARE是NXP的知名品牌,是一个应用广泛的非接触式IC产品(13.56MHz非接触性辨识技术),一个典型的通信距离为10厘米,在全球有40多个不同的应用领域.有2.6亿个读写器 ...
- sqlserver 汉字转拼音 首写字母 索引 函数
create function fun_getPY(@str nvarchar(4000)) returns nvarchar(4000) as begin declare @word nchar(1 ...
- glibc内存泄露以及TCmalloc 简单分析
最近开发一个私人程序时碰到了严重的内存问题,具体表现为:进程占用的内存会随着访问高峰不断上升,直到发生OOM被kill为止.我们使用valgrind等工具进行检查发现程序并无内存泄露,经过仔细调查我们 ...
- linux系统——ld-linux.so.X查找和加载共享动态库的顺序
ld-linux.so查找共享库的顺序: Glibc安装的库中有一个为ld-linux.so.X,其中X为一个数字,在不同的平台上名字也会不同.可以用ldd查看: #ldd /bin/cat linu ...
- mac 安装 visual studio 配置
前言:今天主要分享的是 Mac 下一款编程软件--Visual Studio,的确,这款软件之前一直是只有 Windows 系统独占的,2017年终于开发了 Mac 版本. 微软这次为 Mac 开发者 ...
- 合唱队形(DP)
原题传送门 这道题目就是裸的DP题, 我们所需要得到的是一个倒V形的数列 即一个上升子序列与下降子序列的合体.. 所以我们只需要做一遍从1到n的最长上升子序列和从n到1的最长上升子序列即可 时间复杂度 ...
- 【推荐】nodeJS后台守护进程-forever
A simple CLI tool for ensuring that a given node script runs continuously (i.e. forever) 本地执行: npm i ...
- Fiddler抓包1-抓firefox上https请求【转载】
本篇转自博客:上海-悠悠 原文地址:http://www.cnblogs.com/yoyoketang/p/6538021.html 前言 fiddler是一个很好的抓包工具,默认是抓http请求的, ...
- 第一章:1-20、试计算以下两种情况的发送时延和传播时延: (1) 数据长度为107bit,数据发送速率为100kbit/s,传播距离为1000km,信号在媒体上 的传播速率为2×108m/s。 (2) 数据长度为103bit,数据发送速率为1Gbit/s,传输距离和信号在媒体上的传播速率同 上。
<计算机网络>谢希仁著第四版课后习题答案答: 1):发送延迟=107/(100×1000)=100s 传播延迟=1000×1000/(2×108)=5×10-3s=5ms ...