29

OCMock 1.70を使用していますが、BOOL値を返す単純なメソッドのモックに問題があります。これが私のコードです:

@interface MyClass : NSObject
- (void)methodWithArg:(id)arg;
- (BOOL)methodWithBOOLResult;
@end
@implementation MyClass
- (void)methodWithArg:(id)arg {
    NSLog(@"methodWithArg: %@", arg);
}
- (BOOL)methodWithBOOLResult {
    NSLog(@"methodWithBOOLResult");
    return YES;
}
@end

- (void)testMock {
    id real = [[[MyClass alloc] init] autorelease];
    [real methodWithArg:@"foo"];
    //=> SUCCESS: logs "methodWithArg: foo"

    id mock = [OCMockObject mockForClass:[MyClass class]];
    [[mock stub] methodWithArg:[OCMArg any]];
    [mock methodWithArg:@"foo"];
    //=> SUCCESS: "nothing" happens

    NSAssert([real methodWithBOOLResult], nil);
    //=> SUCCESS: logs "methodWithBOOLResult", YES returned

    BOOL boolResult = YES;
    [[[mock stub] andReturn:OCMOCK_VALUE(boolResult)] methodWithBOOLResult];
    NSAssert([mock methodWithBOOLResult], nil);
    //=> FAILURE: raises an NSInvalidArgumentException:
    //   Expected invocation with object return type.
}

私は何が間違っているのですか?

4

3 に答える 3

65

あなたは使用する必要はありandReturnValue:ませんandReturn:

[[[mock stub] andReturnValue:OCMOCK_VALUE(boolResult)] methodWithBOOLResult];
于 2010-12-05T03:49:21.640 に答える
5

ヒント:すべてandReturnValue:を受け入れます NSValue-特にNSNumber。プリミティブ/スカラーの戻り値を使用してメソッドをより迅速にスタブするには、ローカル変数宣言を完全にスキップして、を使用します[NSNumber numberWithXxx:...]

例えば:

[[[mock stub] andReturnValue:[NSNumber numberWithBool:NO]] methodWithBOOLResult];

自動ボクシングのボーナスポイントについては、数値リテラル構文(Clang docs)を使用できます。

[[[mock stub] andReturnValue:@(NO)] methodWithBOOLResult];
[[[mock stub] andReturnValue:@(123)] methodWithIntResult];
[[[mock stub] andReturnValue:@(123.456)] methodWithDoubleResult];
etc.
于 2013-12-11T23:22:55.330 に答える
1

OCMockのバージョン3.3.1を使用していますが、この構文は次のように機能します。

SomeClass *myMockedObject = OCMClassMock([SomeClass class]);
OCMStub([myMockedObject someMethodWithSomeParam:someParam]).andReturn(YES);

その他の例については、OCMockのドキュメントを参照してください。

于 2016-12-15T11:36:31.620 に答える