Objective c OCMockito-带“的模拟类;willReturn";返回nil,而不是我指定的值
我正在使用的代码如下所示:-Objective c OCMockito-带“的模拟类;willReturn";返回nil,而不是我指定的值,objective-c,dependency-injection,tdd,ocmockito,Objective C,Dependency Injection,Tdd,Ocmockito,我正在使用的代码如下所示:- - (MyOrange *) getAnOrangeFromBowl:(MyBowl *)bowl withSize:(NSString *)size { MyOrange *orange = [bowl getAnOrangeWithSize:size]; return orange; } 在您提问之前,不,我不能直接调用我的“MyBowl”对象的方法,它需要以这种方式完成,原因与此问题无关 因此,我想测试一下,在上述方法中,[bowl getA
- (MyOrange *) getAnOrangeFromBowl:(MyBowl *)bowl withSize:(NSString *)size
{
MyOrange *orange = [bowl getAnOrangeWithSize:size];
return orange;
}
在您提问之前,不,我不能直接调用我的“MyBowl”对象的方法,它需要以这种方式完成,原因与此问题无关
因此,我想测试一下,在上述方法中,[bowl getAnOrangeWithSize]是用某些参数调用的。我想模拟MyBowl类,因为它不是这里测试的对象,只是上面的方法。我还希望[bowl getAnOrangeWithSize]调用返回MyOrange的模拟值——在本例中,只是为了比较,但我可能也在使用上述方法中的“橙色”进行操作&我也想对其进行测试
为了测试这一点,我想注入一个依赖项(MyBowl mock),该依赖项反过来注入另一个模拟依赖项(MyOrange)。我已经多次遇到这个需求,并进行了重构以解决它,但在这种情况下,我被卡住了
无论如何,我的测试是:-
- (void)testThatGetAnOrangeFromBowlIsReturningAValidOrange
{
MyOrange *mockOrange = mock([MyOrange class]);
MyBowl *mockBowl = mock([MyBowl class]);
[given([mockBowl getAnOrangeWithSize:@"large"]) willReturn:mockOrange];
MyOrange *returnedOrange = [sut getAnOrangeFromBowl:mockBowl withSize:@"large"];
assertThat(returnedOrange, is(equalTo(mockOrange)));
}
测试失败,因为ReturnedRange为零。在代码中放置断点,我可以看到对“getAnOrangeWithSize”的调用返回nil,因此它显然没有注意到我指定的给定/将返回指令
我一直在搜索文档&为此挠头已有一段时间,尝试了各种想法,但运气不佳。有没有办法让测试正常工作,或者这是OCMockito不支持的(如果有,Kiwi能解决这个问题)?提前谢谢
编辑:在猕猴桃中似乎可以这样做,如下所示:-
it(@"should return a valid Orange", ^{
id mockOrange = [MyOrange mock];
id mockBowl = [MyBowl mock];
[mockBowl stub:@selector(getAnOrangeWithSize:) andReturn:mockOrange];
MyOrange *returnedOrange = [sut getAnOrangeFromBowl:mockBowl withSize:@"whatever"];
[[returnedOrange should] equal:mockOrange];
});
如果在sut的代码中发生了对mockOrange内部方法的调用,则可以将mockOrange设置为nullMock或创建存根来处理这些调用
我对猕猴桃很陌生,所以上述情况可能不是最好的。我还没有发现如何创建一个只对传入的某些参数值起作用的存根,这样你就可以创建一个大小为“大”的存根,返回一个MyOrange实例,而“霉”返回另一个实例,但如果我找不到它是如何完成的,我想这是另一个问题的主题
我仍然非常想知道上述Kiwi代码的OCMockito/Hamcrest等价物,因此我暂时不回答这个问题。您的示例在OCMockito中运行良好,因此您的示例代码不是问题所在。它是其他地方的代码——或者,我怀疑,是不存在的代码: OCMockito对给定的方法参数使用OCHamcrest匹配器。如果提供的参数不是匹配器,它会将其包装在
equalTo(…)
matcher中
但是,如果所讨论的类没有实现-isEqual:
,那么等式匹配器将永远不会得到满足。默认情况下,OCMockito对没有匹配的给定的语句的任何内容返回nil
因此,所讨论的类要么需要实现相等,要么在给定的语句中显式指定不同的匹配器。在这种情况下,我通常使用sameInstance(…)
来测试身份而不是平等性。有时参数本身并不重要,在这种情况下,我使用anything()
您能展示getAnOrangeFromBowl:
的实现吗?这会有帮助吗?我在模拟“MyBowl”类&指定对该方法的调用应该返回什么。我的理解是,真正的MyBowl类及其方法从未被使用过,如果是这样,MyBowl的实际实现就无关紧要了——除非我错了?也许,我对OCMockito
不太熟悉。你确实是对的——在我真正的代码中(我上面发布的显然是一个模拟示例)我在给定的代码中没有以与在生产代码中调用完全相同的方式指定参数。一个小错误,我的眼睛掩盖了几十次。一旦纠正了这一点,Ocmocito测试现在就可以工作了。感谢您花时间查看该问题并发布您的答案,我很遗憾,所有这些问题都是我的错误,而不是对整个社区更有帮助的事情。生活与学习!哦,不,这很有用,因为其他人会在同一个地方绊倒。我可以添加一个常见问题。