Rog*_*ien 8 java string junit android is-empty
我知道这很奇怪,但这就是我所拥有的.
我正在编写一个单元测试来检查我的Android应用程序的逻辑.在测试执行期间,我发现它在该行上失败:
if (!TextUtils.isEmpty(fromFile))
在该if语句之前,fromFile等于""(空字符串),但它以某种方式传递给它,并与另一个不期望空字符串的逻辑断开.
潜入调试我看到它fromFile.isEmpty()返回正确的结果,但TextUtils.isEmpty(fromFile)说它不是空的.
打开源代码,我看到:
public static boolean isEmpty(@Nullable CharSequence str) {
if (str == null || str.length() == 0)
return true;
else
return false;
}
Run Code Online (Sandbox Code Playgroud)
和String.java:
public boolean isEmpty() {
return value.length == 0;
}
Run Code Online (Sandbox Code Playgroud)
我有以下配置:jdk 1.8.0_77
我想避免应用程序中的整个逻辑支持String.isEmpty()只是为了通过测试,因为我需要在Android API 9之前支持代码,哪里String.isEmpty不可用,还要TextUtils.isEmpty()做更多.任何有关澄清和建议的帮助都会有所帮助.
有人面对过吗?我该如何解决?提前致谢!
Rog*_*ien 10
对于将来会面对它的人:
我在好人的帮助下想出了这个,它与gradle中的android单元测试配置有关:
testOptions {
unitTests.returnDefaultValues = true
}
Run Code Online (Sandbox Code Playgroud)
这让我想到了一个解决方案:在您使用JUnit(单元测试)测试的商务逻辑中摆脱Android依赖关系.
我只是android.text.TextUtils用我自己的MyStringUtils.java类中的方法替换,它也是一样的.
问题是,通过deault,Android方法确实在运行单元测试时返回了deafult值,并且它实际上并没有检查fromFile值本身,而是返回存根/默认值.
TextUtils不是 JUnit 方法。如果您需要使用TextUtils.isEmptyanswer 或其他方法进行操作,您可以像这样模拟它:
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;
}
});
Run Code Online (Sandbox Code Playgroud)
不要忘记添加TextUtils到PrepareForTest列表中:
@PrepareForTest({TextUtils.class})
Run Code Online (Sandbox Code Playgroud)
上述方法也适用于returnDefaultValues配置:
testOptions {
unitTests.returnDefaultValues = true
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2210 次 |
| 最近记录: |