JUnit4 TextUtils.isEmpty () дает другой результат, чем String.isEmpty()
Я знаю, это странно, но это то, что у меня есть.
Я пишу модульный тест, чтобы проверить свою логику для приложения 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
}