根据我正在测试的代码,我的行为异常奇怪。我编写的测试是在Android返回空包名称的情况下查看类的行为。经过一些调试后,我发现了这一点(考虑到packageName为空):

 val resultFromKotlin = packageName.isNullOrEmpty()
 val resultFromJava = StringUtils.isEmpty(packageName)


java - 字符串空测试(java x kotlin)中的值错误-LMLPHP

这是预期的吗?有人可以告诉我如何处理吗?

ps1:在上图中,Android Studio抱怨isNullOrEmpty表示可以简化,因为此时packageName不能为null。

ps2 ::供参考:

StringUtils类用Java编写,如下所示:

public static boolean isEmpty(String str) {
    return str == null || TextUtils.isEmpty(str.trim());
}


TextUtils也是froJavava,但它是Android库的一部分:

public static boolean isEmpty(@Nullable CharSequence str) {
    return str == null || str.length() == 0;
}


这是kotlin实现其扩展方法的方式:

public inline fun CharSequence?.isNullOrEmpty(): Boolean {
    contract {
        returns(false) implies (this@isNullOrEmpty != null)
    }

    return this == null || this.length == 0
}


编辑08/11/2018:
只是为了澄清,我的问题是从Java返回的错误值,而不是在测试中寻找对等项,而且:
java - 字符串空测试(java x kotlin)中的值错误-LMLPHP

最佳答案

运行测试时,这似乎是TextUtils的问题。


  如果您正在运行单元测试,则将模拟Android框架方法,尤其是此方法将返回false。使用检测测试可在完整的Android运行时上运行。


Here是讨论该问题的地方。

我已经通过重新创建该函数进行了手动测试,并且返回true。

我建议使用Apache Commons StringUtils实现:StringUtils

09-30 14:47
查看更多