assertEquals JUnit方法参数倒置是否有很大风险?

时间:2019-07-15 17:56:55

标签: java junit

JUnit规范在显示重载的as​​serEquals方法时为开发人员提供以下签名:

assertEquals([TYPE] expected, [TYPE] actual)

如果在业务环境中逻辑上更改期望参数的顺序,请考虑:

// Class provides correct surname based on name or age etc.
class SurnameProvider {
    static String getSurnameForName(String name) {
        // implementation
    }
} 

@org.junit.Test
public void test() {
    String retrievedSurname = SurnameProvider.getSurnameForName("Vilde");
    String expectedSurname = "Hansen";
    assertEquals(retrievedSurname, expectedSurname); // here expected value is second
}

订单(实际第一和预期第二)是否会造成任何风险或非常不适当?

2 个答案:

答案 0 :(得分:1)

当断言失败时,该顺序会影响JUnit框架生成的错误消息。请参阅以下单元测试代码:

int numberOfHoursPerDay = 2+6*9-5;
Assertions.assertEquals(24, numberOfHoursPerDay);

这将生成以下错误消息:

  

预期:<24>,但仍是:<51>

因此,您可以轻松查看并检查:“嗯,应该是24,为什么返回51?”。如果您这样更改顺序:

int numberOfHoursPerDay = 2+6*9-5;
Assertions.assertEquals(numberOfHoursPerDay, 24);

您将收到以下消息:

  

预期:<51>,但仍是:<24>

现在您正在思考:“嗯,24听起来不错,但是为什么应该是51?”当您尝试对其进行修复时,您会看到“等等,为什么现在应该是38?不应该像以前那样是51?不,请稍等,应该是24。怎么了??”。

因此,更改值的顺序只会使和所有正在运行/使用单元测试的人感到困惑。

答案 1 :(得分:0)

我不知道这有什么风险。而且NullPointerException仅在取消引用空对象时调用方法时才会发生,因此在您的示例中不应发生。

但是,代码约定将期望值放在实际值之前。这基本上是行业遵循的标准。