Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将NullPointerException视为单元测试失败:这是一个好的实践吗?_Java_Unit Testing_Junit_Tdd_Testng - Fatal编程技术网

Java 将NullPointerException视为单元测试失败:这是一个好的实践吗?

Java 将NullPointerException视为单元测试失败:这是一个好的实践吗?,java,unit-testing,junit,tdd,testng,Java,Unit Testing,Junit,Tdd,Testng,假设您有一个包含这些行的单元测试 assertNotNull(someVal); assertNotEmpty(someVal); 这显然会检查someVal是否为null,并且是否填充了某些内容 问题是,第一行是必要的吗?它是否为测试添加了任何内容?我们不应该只有第二行,如果它为null,它将抛出一个null指针异常,它仍然指示单元测试失败(但不是一个失败的断言) 在这种简单的情况下,最佳做法是什么?您不应该将NPE视为测试失败。您应该实际声明它不是null并提供错误消息 assertNot

假设您有一个包含这些行的单元测试

assertNotNull(someVal);
assertNotEmpty(someVal);
这显然会检查someVal是否为null,并且是否填充了某些内容

问题是,第一行是必要的吗?它是否为测试添加了任何内容?我们不应该只有第二行,如果它为null,它将抛出一个null指针异常,它仍然指示单元测试失败(但不是一个失败的断言)


在这种简单的情况下,最佳做法是什么?

您不应该将NPE视为测试失败。您应该实际声明它不是null并提供错误消息


assertNotNull(someVal,表示为什么值不应该为null的一些描述性消息)

视情况而定。假设您正在测试函数myFunc。如果myFunc在非异常情况下返回null,我认为检查结果是否为非null和正确值是合理的,因为这样可以使测试更清晰


如果null是异常情况,那么检查它类似于在测试中捕获RuntimeException。只会使您的测试变得混乱,模糊您的意图。

JUnit中的失败和错误是有区别的。失败是预期的(使用
assertXXX()
fail()
进行了明确测试),错误是不可能的,通常是异常。看

如果你打电话

assertNotNull(someVal);
然后你说这个值不应该是空的,你正在专门测试它。如果您让NullPointerException发生,那么解释错误的人将不知道测试中的代码是否正确,或者您只是没有考虑所有情况


这是一个意图的问题。正如其他人所指出的,添加解释消息也是一个好主意。

我不太喜欢
assertNot()
,更一般地说,我不喜欢测试SUT可能发生的意外情况,更不用说在每个测试中除了正常的断言之外还测试它们了

在我看来,您应该只测试对象的标称状态。如果在某些情况下,
someVal
为空是正常的,那么创建一个专用的测试方法,检查它在该场景中是否确实为空。为您的测试选择一个显示意图的名称,例如
someValShouldBeNullWhen…()
。对空值或任何其他值执行相同的操作


通过查看测试异常消息,而不是试图提前预测每个意外事件并用assertNots填充测试,您可以看到SUT发生意外情况。

我不同意,要使方法返回null而不是抛出异常,返回必须是显式的。因此,该方法被设计为返回null,因此应该执行null检查。正如Matthew所说,测试中的NPE不是一件好事,因为看到失败的人不知道这是否是代码或测试中的错误。@JohnB显式,但可能不是故意的。或者它是低级类返回null(return componentObject.getFunctionResult())的结果。同时,考虑这个问题。这种推理意味着,每当您对返回对象的函数编写测试时,都应该assertNotNull()。你这样做了吗?实际上是的,因为我做了TDD,所以要做的第一件事就是返回一些非空值。我明白了,如果你不做TDD,这将不是很明显,但可能仍然是良好的做法。也就是说,在检查返回对象中的每一项内容时,我并不总是首先检查null。嗯,可以练习还是懒散?有点牵强。@JohnB关于您正在检查返回对象的对象的有趣的一点。我确实认为这说明了问题,但我会的。回到TDD,让您首先检查非null,您是否也在被测函数周围放置了一个try/catch来捕获运行时异常,并在catch块中放置fail()?如果不是,为什么会不同?因为异常堆栈跟踪中的因果代码行。如果异常是在被测试的方法中抛出的,那么您知道错误在被测试的方法中。如果异常是从测试中的一行代码中抛出的,那么错误(测试或测试中的方法)并不明显。