1
@Test
fun isEmpty_null_true(){
    Assert.assertEquals(StringUtils.isEmpty(null),true)
}

public static boolean isEmpty(@Nullable String value) {
    return (TextUtils.isEmpty(value) || value.trim().isEmpty());
}

除上述方法外,所有测试方法均有效并通过。我正在java.lang.NullPointerException为这个。StringUtils.isEmpty()上面也提到了的实现。StringUtils类是用 Java 编写的,而测试用例文件是用 Kotlin 编写的。

4

4 回答 4

4

问题在于此StringUtils.isEmpty() 方法本身,因为有时TextUtils.isEmpty(null)在您传递时返回 false,value因为您正在对导致修改这样的方法的值null调用trim()方法以避免nulljava.lang.NullPointerExceptionjava.lang.NullPointerException

public static boolean isEmpty(@Nullable String value) {
        return (TextUtils.isEmpty(value) || (value != null && value.trim().isEmpty()));
    }
于 2020-07-13T19:05:38.943 回答
1

如您所知,||操作员将调用双方的代码(以获取一个真值)并null.trim()..导致异常。

由于StringUtils.isEmpty方法的预期行为是在传递值时抛出异常,null因此您应该编写单元测试以期望异常null值如下:

@Test(expected = NullPointerException::class)
fun isEmpty_null_exception(){
    StringUtils.isEmpty(null)
}

这里excepted用于断言该测试方法抛出NullPointerException异常。

注意:对 StringUtils.isEmpty 静态方法使用 mock 是通过PowerMock框架完成的,但这会违反测试代码的实际行为的目的,因此请使用上述推荐的方法来验证异常。您可能想要创建一个模拟输入变量和模拟trim方法,但是您可以简单地使用非空输入字符串,不会有任何区别。

于 2020-07-16T14:05:21.500 回答
0

完整的解决方案,我得到了——
由于在 app/build.gradle 中设置了默认值,我得到了错误的返回值,TextUtils.isEmpty()这不是我所期望的。

testOptions {
    unitTests.returnDefaultValues = true
}

参考 - TextUtils.isEmpty(null) 返回 false
我无法更改 build.gradle 文件中的值,因此我只需要针对我的单元测试方法的解决方案。有一种方法可以为TextUtils.isEmpty()方法提供实现并获取真正的返回值。

    @Before
    public void setup() {
        PowerMockito.mockStatic(TextUtils.class);
        PowerMockito.when(TextUtils.isEmpty(any(CharSequence.class))).thenAnswer(new Answer<Boolean>() {
            @Override
            public Boolean answer(InvocationOnMock invocation) throws Throwable {
                CharSequence a = (CharSequence) invocation.getArguments()[0];
                return !(a != null && a.length() > 0);
            }
        });
   }

参考 - 需要帮助来使用 Mockito 和 JUnit4 编写单元测试

我遇到了同样的问题,android.graphics.Color.parseColor()所以上述解决方案适用于android包中的所有类。

于 2020-07-18T06:58:08.707 回答
-1

也许代替: value.trim().isEmpty()
试试这个:value.trim().equals("")

于 2020-07-11T10:45:07.253 回答