JUnit4 TextUtils.isEmpty()给出与String.isEmpty()不同的结果

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JUnit4 TextUtils.isEmpty()给出与String.isEmpty()不同的结果相关的知识,希望对你有一定的参考价值。

我知道这很奇怪,但这就是我所拥有的。

enter image description here

我正在编写一个单元测试来检查我的android应用程序的逻辑。在测试执行期间,我发现它在该行上失败:

if (!TextUtils.isEmpty(fromFile))

在此之前,来自文件的if语句等于""(空字符串),但不知何故,它会传递给它并打破另一个不期望空字符串的逻辑。

潜入调试我看到fromFile.isEmpty()返回正确的结果,但TextUtils.isEmpty(fromFile)说它不是空的。

打开源代码,我看到:

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

和String.java:

public boolean isEmpty() {
   return value.length == 0;
}

我有以下配置:jdk 1.8.0_77

我想避免应用程序中的整个逻辑支持String.isEmpty()只是为了通过测试,因为我需要在Android API 9之前支持代码,其中String.isEmpty不可用,并且TextUtils.isEmpty()也做更多。任何有关澄清和建议的帮助都会有所帮助。

有人面对过吗?我该如何解决?提前致谢!

答案

对于将来会面对它的人:

我在好人的帮助下想出了这个,它与gradle中的android单元测试配置有关:

testOptions {
    unitTests.returnDefaultValues = true
}

这指出了一个解决方案:摆脱您使用JUnit进行测试的业务逻辑中的android依赖(单元测试)。

我只是用android.text.TextUtils类中我自己的方法替换MyStringUtils.java,它也是如此。

问题是,通过deault Android方法确实在运行单元测试时返回默认值,并且它实际上没有检查fromFile值本身,而是返回存根/默认值。

另一答案

TextUtils不是JUnit方法。如果你需要使用TextUtils.isEmpty答案或其他方法进行操作,你可以像下面这样嘲笑它:

mockStatic(TextUtils.class);
when(TextUtils.isEmpty(any(CharSequence.class))).thenAnswer(new Answer<Boolean>() {
        @Override
        public Boolean answer(InvocationOnMock invocation) throws Throwable {
            CharSequence str = (CharSequence) invocation.getArguments()[0];
            if (str == null || str.length() == 0)
                return true;
            else
                return false;
        }
    });

别忘了将TextUtils添加到PrepareForTest列表:

@PrepareForTest({TextUtils.class})

上面提到的方法也适用于returnDefaultValues配置:

testOptions {
    unitTests.returnDefaultValues = true
}

以上是关于JUnit4 TextUtils.isEmpty()给出与String.isEmpty()不同的结果的主要内容,如果未能解决你的问题,请参考以下文章

TextUtils判断

文本工具 TextUtils 字符串

if(TextUtils.isEmpty(sp.getString("password", ""))),这行代码报空指针异常,怎么解决?

比较版本号

Android TextUtils类

Android中TextUtils类