<分区>
Mockito 不允许模拟 final 方法。 在代码中使用 final 方法是否被认为是不好的做法?为什么?
我不想仅仅为了让测试代码正常工作而更改实现细节,但是,通常测试框架有这些规则来鼓励更好的编码实践。
<分区>
Mockito 不允许模拟 final 方法。 在代码中使用 final 方法是否被认为是不好的做法?为什么?
我不想仅仅为了让测试代码正常工作而更改实现细节,但是,通常测试框架有这些规则来鼓励更好的编码实践。
最佳答案
final
方法在一般情况下绝对不是坏习惯:它们传达了关于方法的行为和语义的特定信息——也就是说,任何调用该方法的人都将获得该实现。 这正是您试图通过模拟颠覆的属性,因为您正在通过(动态生成的)子类覆盖最终实现以执行 stub 行为。
为此,如果你有一个你控制的实现,你试图用一个 stub 替换测试,它可能不应该是final
,因为你把它当作一个非 final
方法自己在你的测试中。您的测试是您的组件的另一个用户,您可以针对该用户进行相应的设计。
在您无法控制的实现中,例如第三方库,PowerMock是模拟构造函数以及 private
、static
和 final
方法的普遍接受的解决方案,可能在 final
中类。不过,PowerMock 确实存在一些危险:
的类final
和 static
方法,以便 Powermock 可以替换这些调用。final
修饰符的语义,它可能会使您的代码更难阅读 — 您声明该方法具有一种定义明确的可预测行为,然后围绕您自己的声明进行工作。 就“最佳实践”而言,真正的最佳实践是 OOP 原则 jgitter上面提到:“Program to interfaces, not implementations.”通过依赖显式接口(interface):
final
方法、测试不可见的方法或methods in superclasses not visible to the test 等实现细节。 . Final 方法特别隐蔽,因为 Mockito can't warn you about them .也就是说,Mockito stub 具体类的简便性使其成为一个诱人的选择,但请注意,最简单的语义正确答案 可能只是删除 final
来自需要 stub 的特定方法。
关于java - 使用 Mockito 进行单元测试时避免 final方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23616285/