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

Java 如何模拟服务的一部分并测试其他部分?,java,easymock,Java,Easymock,我在使用easymock,我在模仿我的UserService类 My UserService有几种方法: boolean canUserLogin(..); boolean canUserJoinClass(...); 现在,一些方法相互调用,如果我正在测试方法1,我希望在方法1中调用存根/模拟方法2和方法3 我感到困惑的是,我如何模拟一个类的某些部分,而让其他部分来运行实际的代码 所以我想实际测试UserService.method#1,但要模拟UserService.method#2和Us

我在使用easymock,我在模仿我的UserService类

My UserService有几种方法:

boolean canUserLogin(..);
boolean canUserJoinClass(...);
现在,一些方法相互调用,如果我正在测试方法1,我希望在方法1中调用存根/模拟方法2和方法3

我感到困惑的是,我如何模拟一个类的某些部分,而让其他部分来运行实际的代码


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

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

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

我同意文件(和其他答案),这可能是一个粗略设计的迹象。如果没有进一步的细节,很难说它有多粗略,如果它是真的;有关示例,请参见

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

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

模拟用于依赖项,因此您可以单独进行测试。在本例中,您没有任何依赖项,因为您正在调用的方法位于一个类上。所以我不会在这里嘲笑你


如果方法2和3非常复杂,您在测试方法1时希望对它们进行模拟,那么您可能应该将它们分离到它们自己的类中,这样您就可以轻松地对它们进行模拟。

模拟用于依赖项,因此您可以单独进行测试。在本例中,您没有任何依赖项,因为您正在调用的方法位于一个类上。所以我不会在这里嘲笑你


如果方法2和3非常复杂,您在测试方法1时想要模拟它们,那么也许您应该将它们分离到它们自己的类中,这样您就可以轻松地模拟它们。

您可以查看一些库,如Easymock,但我不确定它是否可以做到这一点

这是我没有第三方库的解决方案。创建UserService的子类,并重写要模拟的方法

class SubUserService{

  @override
  boolean canUserJoinClass(...){
    return false;
  }

}
但是请注意,mock方法不能是私有的


如果这是您遇到的一个实际问题,您应该将方法重构为不同的类。

您可以查看一些库,如Easymock,但我不确定它是否可以做到这一点

这是我没有第三方库的解决方案。创建UserService的子类,并重写要模拟的方法

class SubUserService{

  @override
  boolean canUserJoinClass(...){
    return false;
  }

}
但是请注意,mock方法不能是私有的

如果这是您遇到的一个实际问题,您应该将方法重构为不同的类。

我知道Mockito支持对实际对象进行“间谍”。我在Easy Mock中找不到一个等价物。所以,我不确定你是否能做到这一点

话虽如此,这对我来说是一种气味。你为什么要嘲笑它?这是否表明您的对象做得太多,因此您需要模拟其他交互

此外,每当您需要担心方法(本例中为方法1)的实现时,即它调用method2和method3的事实,尤其是同一个类,我觉得这听起来像是封装泄漏。

我知道Mockito支持对真实对象进行“间谍”。我在Easy Mock中找不到一个等价物。所以,我不确定你是否能做到这一点

话虽如此,这对我来说是一种气味。你为什么要嘲笑它?这是否表明您的对象做得太多,因此您需要模拟其他交互

此外,每当您需要担心方法(本例中为方法1)的实现时,即它调用method2和method3的事实,尤其是同一个类,我觉得这听起来像是封装泄漏