Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 伪造没有接口的类_Java_Unit Testing - Fatal编程技术网

Java 伪造没有接口的类

Java 伪造没有接口的类,java,unit-testing,Java,Unit Testing,在进行单元测试时,我更喜欢使用假类而不是模拟类(可读性更强)。这在Python中非常有效,但在Java世界中,我通常需要为我要替换的类创建一个接口。这意味着我现在有了3节课,而不是1节课: 原始类 接口 用于测试的假版本 如果我想实现一个真正好的测试覆盖率,这实际上意味着我需要为我的项目中的每一个类都这样做,这是不可接受的。我只想为在生产代码中真正有多个实现的类创建一个接口 我注意到Mockito允许您在不创建接口的情况下模拟具体类。我可以用这样的技巧来做假课吗 例如,在测试注册系统时,会有

在进行单元测试时,我更喜欢使用假类而不是模拟类(可读性更强)。这在Python中非常有效,但在Java世界中,我通常需要为我要替换的类创建一个接口。这意味着我现在有了3节课,而不是1节课:

  • 原始类
  • 接口
  • 用于测试的假版本
如果我想实现一个真正好的测试覆盖率,这实际上意味着我需要为我的项目中的每一个类都这样做,这是不可接受的。我只想为在生产代码中真正有多个实现的类创建一个接口

我注意到Mockito允许您在不创建接口的情况下模拟具体类。我可以用这样的技巧来做假课吗

例如,在测试注册系统时,会有一个电子邮件类。现在在测试中,我实际上不想发送实际的电子邮件,所以我要么模仿这个类,要么伪造这个类

class FakeEmailService {   
  public void sendEmail(String to, String body) {
    m_sent = true;
  }
}
现在,我的注册系统构造函数接受了原始类,
EmailService
,但我想通过一些技巧,在测试中使用
FakeEmailService

Registration reg=新注册(new FakeEmailService());


这在Python中很好,因为它不是静态类型。

在java/jvm中,您至少有以下选项:

  • 添加接口。正如你提到的,它增加了很多噪音
  • 模拟课。这是最常见、最便宜且可能最有用的选项,如果您不喜欢语法,可以创建自己的工厂
  • 继承类。当然,只有当
    EmailService
    不是最终版本时。但这不是一个好的解决方案,因为它很容易意外地将代码执行传递到原始类中(通过构造函数而不是重写的方法),并且在测试中有意外的行为
  • 使用任何其他允许duck类型的jvm语言。e、 groovy非常流行,并且易于与java结合。它提供了简单的嘲弄。使用spock框架,您将获得更强大的模拟功能。但是,依我看,它的重构支持比java差得多
  • 我不知道有任何工具可以做到这一点,但我可以想象,您所需要的可以通过使用一些高级代码处理(如lombok)和/或自定义类加载(如powermock)来实现。我可以想象使用它们来模拟java中的duck类型。不过,我也没听说过这样的工具

  • 解释什么是“假”类。即使没有接口,
    EmailService
    FakeEmailService
    不是仍然是两个独立的类吗?依赖类应该依赖抽象而不是具体化。这允许更大的灵活性,因为它允许您在单元测试时使用伪造/模拟/存根(选择毒药)替换生产依赖项。它使依赖的代码更加可靠。为什么你的假类不能成为真实类的子类,而所有的方法都被重新定义了?