当前位置: 首页 > 知识库问答 >
问题:

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

东郭弘
2023-03-14

在Java/JUnit中,我需要用一些对象来测试null。有多种方法可以测试条件,但我在大多数测试中都使用assertTrue。当我检查assertTrue中的Null时,EclEmma声明它只测试一个分支。

当我手动将语句解析为变量时(比如将结果设置为布尔值并将其传递到assertTrue中),assert上的代码覆盖率被认为是完整的,但变量初始化行上的代码覆盖率不是完整的。

为什么会出现这种情况?这是否与Java在http://sourceforge.net/apps/trac/eclemma/wiki/filteringoptions上提到的添加的额外字节码有关?任何解决方案(除了使用其他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;

共有1个答案

祁正阳
2023-03-14

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

在您的代码中,您使用的布尔表达式是myobject==null

为了计算这个值,Java编译器生成代码,将两个参数推送到堆栈上,然后执行条件跳转,以便将1(真)或0(假)推送到堆栈上。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代码的条件复盖率(而不仅仅是分支复盖率)。

    null

因此,它确实与生成的额外字节代码有关,但与筛选选项要用于的合成字节编译器构造的特定示例无关。

注意:做了主要编辑,因为最初的答案是太多的猜测。感谢@ira-baxter的好的和批判性的讨论。

 类似资料:
  • 我知道使用尽可能最小的数据类型的原则,但我想知道为什么这会适用于MySQL中的TEXT/MEDIUMTEXT/LONGTEXT?如果我使用LONGTEXT而不是MEDIUMTEXT,是否存在性能问题?我发现了这样一个问题:当每个条目都适合中等文本大小的字段时,使用MySQL longtext大小的字段的缺点是什么?但我认为这不是性能问题的答案? 这只是一个为LONGTEXT增加一点存储空间的问题吗

  • 问题内容: 这是一个非常愚蠢的问题,但这是我第一次进行单元测试,因此:可以说我有一个像obj这样的对象变量,并且如果此obj为Null,我希望我的单元测试失败。所以对于断言,我应该说AssertNull还是AssertNotNull吗?我很困惑他们的名字。 问题答案: 使用。意味着。

  • 问题内容: 我对php比较陌生。有一件非常基本的事情困扰着我。我了解php用于使网站动态化。我也了解php是可用于创建动态网站的许多服务器端脚本语言之一。 但是,我不明白的是,何时需要使用index.php页面。例如,如果我的索引页面上只有一个简单的登录页面,那么它也可能只是一个简单的html页面。对?那我为什么要使它成为index.php而不是index.html? 一个示例情况的例子将是很好的

  • 我需要你的帮助, 似乎我在尝试在容器div内的textarea周围添加div以及包含容器div底部按钮的div边框时遇到了一些困难。 第一个问题:右侧边框丢失 第二个问题,inner2 div缺少1px纯红。 以下是问题和期望结果的图片: 预期结果是: 这里是超文本标记语言

  • 我正在尝试使用插件 我放“www.google.com”只是为了调试。 我得到的错误是缺少PluginException: 从ide重新启动应用程序无效。

  • 问题内容: 我刚刚开始阅读JPA,并且在休眠中的实现了解了细节。但是,在那之前继续开发,您能否帮助您阐明基本的qn。 何时 使用OneToOne如果实体管理器需要处理相关对象的持久性,则可以使用OneToOne。关键是,我始终可以在不指定oneToOne的情况下生活,但是我有责任管理这种关系并确保所引用的对象不处于过渡状态。这是真的? 何时使用或不使用ManyToOne 假设我正在定义Employ