gpt4 book ai didi

java - 伪造没有接口(interface)的类

转载 作者:行者123 更新时间:2023-11-30 07:01:36 25 4
gpt4 key购买 nike

在单元测试时,我更喜欢使用假类而不是模拟(更具可读性)。这在 Python 中对我来说效果很好,但在 Java 世界中我通常需要为我要替换的类创建一个接口(interface)。这意味着我现在有 3 个类,而不是 1 个类:

  • 原始类
  • 接口(interface)
  • 用于测试的假版本

如果我想获得非常好的测试覆盖率,这实际上意味着我需要对项目中的每个类都执行此操作,这是 Not Acceptable 。我只想为在生产代码中真正具有多个实现的类创建一个接口(interface)。

我注意到 Mockito 允许您模拟具体类而无需创建接口(interface)。我可以在假类(class)中使用类似的技巧吗?

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

class FakeEmailService {   
public void sendEmail(String to, String body) {
m_sent = true;
}
}

现在我的注册系统构造函数接受原始类 EmailService 但我想通过一些技巧在测试中使用 FakeEmailService:

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

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

最佳答案

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

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

关于java - 伪造没有接口(interface)的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40825867/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com