如何通过PowerMockito模拟String#equals方法

时间:2016-11-19 21:55:24

标签: java unit-testing powermock powermockito

我有一个包含字符串比较的方法:

java.net.InetAddress#isReachable()

在单元测试中,我尝试过:

if (stringA.equals(stringB)) { ... }

但这实际上会回归真实。谁能告诉我如何通过PowerMockito模拟String#equals方法?感谢。

2 个答案:

答案 0 :(得分:1)

除了模仿最终方法 hard 之外;特别是当你试图将这样的核心类操作为java.lang.String时;这里的真实点具有不同的性质:它只是错误来覆盖测试的String.equals()。

简单地说:如果你的逻辑依赖于比较两个对象,那么你应该专注于提出一种设计,允许你注入这两个值中的至少一个 - 而不是使用脏脏黑客操纵相应的等于方法的内部!

但是如果您的设计是这样的,您认为您需要PowerMockito才能使其可测试(通过覆盖String.equals())方法;最有可能的是:您只是首先创建了 untestable 代码。

因此我的“不回答”。退出当前的方法,查看这些videos以了解如何编写可测试的代码;然后回来重新设计你的设计。

人们常常创建一个破碎的设计;然后他们认为 PowerMock(ito)是“修复”破坏设计后果的方法。而且往往是完全相反的:如果你认为你需要PowerMock(ito),那么你的设计应该重新设计。

答案 1 :(得分:0)

Java字符串是最终类,因此您必须使用模拟最终策略,例如@PrepareForTest(ClassWithFinal.class) https://github.com/jayway/powermock/wiki/mockfinal

我会重新考虑这样做的原因,你应该重构测试而不是模拟核心java类。 Why is String class declared final in Java?