Java 伪造没有接口的类
在进行单元测试时,我更喜欢使用假类而不是模拟类(可读性更强)。这在Python中非常有效,但在Java世界中,我通常需要为我要替换的类创建一个接口。这意味着我现在有了3节课,而不是1节课:Java 伪造没有接口的类,java,unit-testing,Java,Unit Testing,在进行单元测试时,我更喜欢使用假类而不是模拟类(可读性更强)。这在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
不是最终版本时。但这不是一个好的解决方案,因为它很容易意外地将代码执行传递到原始类中(通过构造函数而不是重写的方法),并且在测试中有意外的行为解释什么是“假”类。即使没有接口,
EmailService
和FakeEmailService
不是仍然是两个独立的类吗?依赖类应该依赖抽象而不是具体化。这允许更大的灵活性,因为它允许您在单元测试时使用伪造/模拟/存根(选择毒药)替换生产依赖项。它使依赖的代码更加可靠。为什么你的假类不能成为真实类的子类,而所有的方法都被重新定义了?