【问题标题】:How to assertThat String is not empty如何断言字符串不为空
【发布时间】:2017-10-20 13:49:54
【问题描述】:

在junit中断言string不为空可以通过以下方式完成:

 assertTrue(!string.isEmpty());
 assertFalse(string.isEmpty());
 assertThat(string.toCharArray(), is(not(emptyArray())); // (although this didn't compile)

我的问题是:有没有更好的检查方法 - 例如:

assertThat(string, is(not(empty()))?

【问题讨论】:

  • 这些字符串操作有一个匹配器:IsEmptyString
  • 另一种选择:assertThat(string.isEmpty(), is(false))

标签: java unit-testing junit hamcrest


【解决方案1】:

编写您自己的 TestHelper 类,您可以在其中收集断言的自定义方法,例如

 public static void assertEmpty(String input) {...}

【讨论】:

  • 这是我可以实现的。这是否意味着,没有其他方法可以使用 Mathcers
  • 这只是一个提示。您的应用程序越大,拥有支持测试您自己的业务逻辑的自定义断言和辅助方法会很有帮助。例如,您可以使用 assertPasswordOk(password) 方法来检查有效密码的所有条件,而不是测试 assertTrue(password.length>6)
  • 这种方法适用于特定领域的事物。对于诸如断言空虚之类的通用内容,请参阅 @Tomasz Bawor 所建议的 AssertJ 等库。
【解决方案2】:

你想要断言的是你的字符串的大小。

assertThat("String is empty",
       string.length(),
       greaterThan(0));

【讨论】:

  • 如果 String 为 null,则会抛出 NullPointerException。
【解决方案3】:

您还可以使用名为AssertJ 的库,它为您的代码提供了非常流畅的断言。可以优雅地完成检查:

assertThat(myString).isNotEmpty();

【讨论】:

【解决方案4】:

我会使用assertThat(string, is(not(equalTo(""))))。与涉及检查字符串的.length().isEmpty() 方法结果的其他方法不同,这将在测试失败时在错误消息中显示字符串的内容。

(编辑:实际上,不,我不会。我会使用holi-java's answer 中解释的emptyString()isEmptyString() 匹配器。支持那个,而不是这个。 )

【讨论】:

    【解决方案5】:

    在 hamcrest 1.3 中,您可以使用 Matchers#isEmptyString

    assertThat(string, not(isEmptyString()));
    

    在 hamcrest 2.0 中,您可以使用 Matchers#emptyString

    assertThat(string, is(not(emptyString())));
    

    更新 - 请注意:“Maven 中心有一些额外的工件,称为 java-hamcrest 和 hamcrest-java,版本为 2.0.0.0。请不要使用它们,因为它们已中止努力重新包装不同的罐子。”来源:hamcrest.org/JavaHamcrest/distributables

    【讨论】:

    • 是的,但你的更好(或者至少,这是我实际使用的,现在我知道它存在)。
    • @Wyzard 是的,它可以让测试代码更可读(我们可以把表现力测试看成一篇文章)。
    • 很好的答案,但要注意当字符串为空时语句返回 true。根据您的规范,您可能希望将 CoreMatchers.notNullValue() 添加到您的测试中。
    • @StevenKuypers 是的,先生。但问题是检查 String 是否为空而不是 null 或空。为此有相关的匹配器,例如:1.3 中的 isEmptyOrNullString() 或 2.0 中的 emptyOrNullString()
    • 真的有“hamcrest 2.0”吗? “Maven 中心有一些额外的工件,称为 java-hamcrest 和 hamcrest-java,版本为 2.0.0.0。请不要使用它们,因为它们在重新打包不同的 jar 时已中止。”来源:hamcrest.org/JavaHamcrest/distributables
    【解决方案6】:

    你可以使用JUnit自己的assertNotEquals断言:

    Assert.assertNotEquals( "", string );
    

    【讨论】:

      【解决方案7】:

      如果您已经在使用commons-lang3,您可以这样做,它还会检查空值和空格:

      assertTrue(StringUtils.isNotBlank(string));
      

      如他们的 javadocs 中所述:

      isNotBlank : 检查 CharSequence 是否不为空 ("")、不为 null 且不为空格。

      【讨论】:

      • 很好的解决方案!!!我会在下一个案例中考虑到这一点。
      • 由于 OP 没有提到“空白”案例,entpnerd's answer 更相关。
      【解决方案8】:

      您可以使用Google Guava库方法Strings.isNullOrEmpty

      来自 JavaDoc

      public static boolean isNullOrEmpty(@Nullable String string)

      如果给定字符串为 null 或为空字符串,则返回 true。

      考虑使用 nullToEmpty(java.lang.String) 规范化您的字符串引用。 如果这样做,您可以使用 String.isEmpty() 代替此方法,并且 您不需要特殊的 null 安全形式的方法,例如 String.toUpperCase(java.util.Locale) 要么。或者,如果您愿意 规范化“在另一个方向”,将空字符串转换为 null, 你可以使用emptyToNull(java.lang.String)。

      参数

      string - 要检查的字符串引用

      返回

      如果字符串为空或为空字符串则为真

      【讨论】:

      • 感谢您的回答。但我的问题与字符串可以为空无关,但断言字符串不为空的方式(我已经介绍了可空性部分,它超出了这个问题的范围)。
      【解决方案9】:

      考虑使用 Apache 的 StringUtils.isNotEmpty() 方法,这是对空字符串的 null 安全检查。

      assertTrue(StringUtils.isNotEmpty(str));
      

      【讨论】:

      • 这不是一个很好的测试解决方案,因为当它失败时你不会看到值。
      • 我听到你在说什么,但我认为这是一个不错的测试解决方案。我不时在自己的测试中使用这样的代码行,它们运行良好。至于值本身,您要验证的只是它不是空的。因此,如果此断言失败,str 的唯一可能值是null""。如果您确实希望在测试失败时查看该值,您始终可以使用上述代码行的稍微不同的版本:assertTrue("String was empty. str=" + str, StringUtils.isNotEmpty(str));
      • 啊,是啊,其实我是在找对面的时候发现这个问题的,isEmpty
      【解决方案10】:

      没有腘绳肌:

          assertFalse(StringUtils.isEmpty(string));
      

      【讨论】:

        【解决方案11】:

        如果您使用的是 JUnit5,那么您可以使用 assertNotNull("yourString"); 来断言您的 String 是否为空或 null 。

        或者,如果您需要消息,则可以使用

        assertNotNull("your String", "String is empty");
        

        【讨论】:

        • 不正确:assertNotNullassertNull 不验证字符串是否为空("");他们只检查它是否为空。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-23
        相关资源
        最近更新 更多