我正在使用easymock,我正在嘲笑我的UserService类。
我的UserService有几个方法:
boolean canUserLogin(..);
boolean canUserJoinClass(...);
现在有些方法互相调用,如果我正在测试方法#1,我想要在方法#1中调用方法#2和方法#3。
我感到困惑的是,如何模拟某个类的部分并让其他人运行实际代码?
所以我想实际测试UserService.method#1,但模拟方法#1内部调用的UserService.method#2和UserService.method#3。
答案 0 :(得分:3)
通过指定要模拟的方法的返回值;有关示例,请参阅easymock docs。
我同意文档(和其他答案),这可能表明粗略的设计。如果没有进一步的细节,很难说它是多么粗略,如果有的话。
答案 1 :(得分:1)
您可以查看一些像Easymock这样的库,但我不确定它是否可以这样做。
这是我没有第三方库的解决方案。创建UserService的子类,并覆盖要模拟的方法。
class SubUserService{
@override
boolean canUserJoinClass(...){
return false;
}
}
但请注意,mock方法不能是私有的。
如果这是你遇到的一个真正的问题,你应该将方法重构为不同的类。
答案 2 :(得分:1)
我知道Mockito支持真实物体上的“间谍”。我在Easy Mock中找不到相应的东西。所以,我不确定你是否可以这样做。
话虽如此,这对我来说是一种气味。你为什么要嘲笑它?这是否表明您的对象做得太多,因此您需要模拟其他交互?
此外,无论何时你需要担心方法的实现(在这种情况下是方法1),即它调用method2和method3,特别是同一个类的事实,这听起来像封装泄漏。
答案 3 :(得分:0)
Mocking旨在用于依赖项,因此您可以单独进行测试。在这种情况下,您没有任何依赖项,因为您调用的方法是在一个类上。所以我不会在这里使用嘲笑。
如果方法2和3非常复杂,你想在测试方法1时模拟它们,那么也许你应该把它们分成它们自己的类,所以你可以很容易地模拟它们。