junit – 使用assertTrue而不是assertNull时缺少分支

前端之家收集整理的这篇文章主要介绍了junit – 使用assertTrue而不是assertNull时缺少分支前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
Java / Junit中,我需要用一些对象来测试null.有多种方法可以测试一个条件,但是我一直在使用assertTrue来进行大部分的测试.当我在assertTrue中检查null时,EclEmma声明它只是测试一个分支.

当我将语句手动解析为一个变量(如将结果设置为布尔值并将其传递给assertTrue),代码覆盖被认为是在断言上完成,而不是变量初始化行.

为什么会这样?这是否与Java明确提及的额外字节码相关?任何解决方案(除了使用其他assert语句).

assertTrue:

assertTrue( myObject == null ); //1 of 2 branches

assertTrue:

boolean test = (myObject == null); //1 of 2 branches missing
assertTrue(test); // complete

assertNull:

assertNull( myObject ) //complete;

解决方法

对于大多数布尔表达式,Java编译器在字节码中生成额外的分支.
JaCoCo基于生成的字节代码生成“分支覆盖”,而不是基于原始的Java代码,因此显示了您将使用的几乎任何布尔表达式的额外分支覆盖信息.

在你的代码中,你使用的布尔表达式是myObject == null.

要计算此值,Java编译器会生成代码推送堆栈上的两个参数,然后进行条件跳转,以便在堆栈上推送1(true)或0(false). JaCoCo报告了该条件跳转的分支覆盖.

因此,使用myObject == null的事实会触发您所描述的行为.

作为其他一些例子,请尝试:

boolean t = true;
boolean f = false;
boolean result1 = (t && f) || f; // 3 out of 6 missed.
boolean result2 = !t;            // 1 out of 2 missed.

如果布尔表达式是例如由函数返回的,那么在其他地方的if-then-else语句中用作条件,这可能很有用.虽然Java编译器的工作方式主要是后果,但它有助于评估原始Java代码的条件覆盖(而不仅仅是分支覆盖).

这个功能没有太好的记录,但这里有一些指针:

> JaCoCo test cases for Boolean Expressions
> JaCoCo forum discussion on branches generated for the statement a = !a
有没有人有更多文档的指针?

因此,实际上与额外的字节代码相关,而不是针对过滤选项的合成字节编译器构造的具体示例.

注意:自从初次回答以来,主要的EDIT是太多的猜测.感谢@ ira-baxter为好&批判性讨论.

猜你在找的Java相关文章