如何模拟部分服务并测试其他服务?

时间:2012-01-02 16:40:44

标签: java easymock

我正在使用easymock,我正在嘲笑我的UserService类。

我的UserService有几个方法:

boolean canUserLogin(..);
boolean canUserJoinClass(...);

现在有些方法互相调用,如果我正在测试方法#1,我想要在方法#1中调用方法#2和方法#3。

我感到困惑的是,如何模拟某个类的部分并让其他人运行实际代码?

所以我想实际测试UserService.method#1,但模拟方法#1内部调用的UserService.method#2和UserService.method#3。

4 个答案:

答案 0 :(得分:3)

通过指定要模拟的方法的返回值;有关示例,请参阅easymock docs

  • “指定返回值”部分讨论如何为模拟方法创建返回值。
  • “Partial mocking”部分(底部)讨论模拟实际类。

我同意文档(和其他答案),这可能表明粗略的设计。如果没有进一步的细节,很难说它是多么粗略,如果有的话。

答案 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时模拟它们,那么也许你应该把它们分成它们自己的类,所以你可以很容易地模拟它们。