Ash*_*yan 5 java tdd junit testng unit-testing
假设您有一个包含这些行的单元测试
assertNotNull(someVal);
assertNotEmpty(someVal);
Run Code Online (Sandbox Code Playgroud)
显然,这会检查someVal不为null并填充了某些东西。
问题是,第一行是否必要,是否会对测试增加任何内容?如果我们不仅仅拥有第二行,并且如果它为null,它将抛出一个null指针异常,该异常仍然指示失败的单元测试(而不是失败的断言)。
在这种简单情况下的最佳实践是什么?
您不应将NPE视为测试失败。您实际上应该断言它不是null并提供错误消息,
assertNotNull(someVal, "Some descriptive message saying why value should not be null");
我不是assertNot()
s 的忠实粉丝,更普遍的是测试 SUT 上可能发生的意外情况,更不用说在每个测试中除了正常断言之外还测试它们。
IMO 你应该只测试对象的标称状态。如果在某些情况下为 null是正常的,则创建一个专用的测试方法来检查在该情况下它确实为 null。为您的测试选择一个能够揭示意图的名称,例如. 对空值或任何其他值执行相同的操作。someVal
someValShouldBeNullWhen...()
通过查看测试异常消息,您可以看到您的 SUT 发生了意外情况,而不是尝试提前预测这些意外情况,并在您的测试中塞满了断言。