OCMocktesting失败 – 预期的方法没有被调用

INtesting类

-(void)testMyTest { MasterViewController* masterVC = [[MasterViewController alloc]init];//[OCMockObject mockForClass:[MasterViewController class]]; id master = [OCMockObject mockForClass:[DetailViewController class]]; [[master expect] getStringVal:@"PARAM"]; [masterVC doSomething]; [master verify]; } 

在detailViewController中

 -(NSString*)getStringVal:(NSString*)param { NSString *returnParam = [NSString stringWithFormat:@"%@-String",param]; return returnParam; } 

在主视图控制器

  -(void)doSomething { DetailViewController *detail = [[DetailViewController alloc]init]; [detail getStringVal:@"PARAM"]; NSString * returnVal = [detail getStringVal:@"PARAM2"]; NSLog(@"returnVal %@",returnVal); NSLog(@"doSomething"); } 

当我运行testing时,我得到以下错误:

doSomething Unknown.m:0:error: – [iOS5ExampleTests testMyTest]:OCMockObject [DetailViewController]:未调用期望的方法:getStringVal:@“PARAM”

看起来好像这个方法没有被调用。 但是,如果我设置了断点的方法,它会停止并显示该行已被应用程序执行,我也正确地获取日志。

getStringVal方法在真实对象上被调用,因为你已经在doSomething方法内部分配了DetailViewController的新实例,所以它不会被模拟对象调用。

相反,您可以在doSomething方法中进行一些修改

 -(void)doSomething:(DetailViewController *)detail { [detail getStringVal:@"PARAM"]; NSString * returnVal = [detail getStringVal:@"PARAM2"]; NSLog(@"returnVal %@",returnVal); NSLog(@"doSomething"); } 

并在你的testing案例

 -(void)testMyTest { MasterViewController* masterVC = [[MasterViewController alloc]init];//[OCMockObject mockForClass:[MasterViewController class]]; id master = [OCMockObject mockForClass:[DetailViewController class]]; [[master expect] getStringVal:@"PARAM"]; [[master expect] getStringVal:@"PARAM2"]; [masterVC doSomething:master]; [master verify]; } 

这应该工作。

Colud它是因为你的主模拟对象是使用自己的细节视图控制器,而不是你的模拟细节视图控制器?

 -(void)testMyTest { MasterViewController* masterVC = [[MasterViewController alloc]init];//[OCMockObject mockForClass:[MasterViewController class]]; id detailVC = [OCMockObject mockForClass:[DetailViewController class]]; // This is the missing line. If you don't have such a property use setValue:forKey: masterVC.detailViewController = detailVC [[master expect] getStringVal:@"PARAM"]; [masterVC doSomething]; [master verify]; } -(void)doSomething { // This is the offending line: you should be using the mock object not a real one. DetailViewController *detail = [[DetailViewController alloc]init]; [detail getStringVal:@"PARAM"]; NSString * returnVal = [detail getStringVal:@"PARAM2"]; NSLog(@"returnVal %@",returnVal); NSLog(@"doSomething"); }