JUnit4 TextUtils.isEmpty () дает другой результат, чем String.isEmpty()

Я знаю, это странно, но это то, что у меня есть.

enter image description here

Я пишу модульный тест, чтобы проверить свою логику для приложения Android. Во время выполнения теста я вижу, что он терпит неудачу в этой строке:

if (!TextUtils.isEmpty(fromFile))

до этого if оператор fromFile равен "" (пустая строка), но каким-то образом он проходит над ним и ломается с другой логикой, которая не ожидает пустой строки.

дайвинг в debug я видел, что 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;
}

у меня есть следующие configutation: с JDK 1.8.0_77

Я хотел бы избежать всей логики в приложении для поддержки строки.isEmpty () просто пройти тест, так как мне нужно поддерживать код перед Android API 9, где String.isEmpty не имеется, а также TextUtils.isEmpty() сделать больше. Любая помощь с уточнение и suggesttions было бы полезно.

кто-нибудь сталкивался с этим? Как это исправить? Заранее спасибо!

2 ответов


для тех, кто столкнется с этим в будущем:

Я понял это с помощью хорошего человека, что это связано с конфигурацией модульного тестирования android в gradle:

testOptions {
    unitTests.returnDefaultValues = true
}

что указало мне на решение: избавьтесь от зависимостей android в логике вашего бизнеса, которую вы тестируете с помощью JUnit(модульный тест).

Я просто заменил android.text.TextUtils С моим собственным методом, который в MyStringUtils.java класс, который делает то же самое.

проблема была в том, что Део Методы 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 to PrepareForTest список:

@PrepareForTest({TextUtils.class})

также вышеупомянутый метод работает для returnDefaultValues конфигурация:

testOptions {
    unitTests.returnDefaultValues = true
}