java .lang.NullPointerException для нулевого ввода в нулевом безопасном методе stati c - PullRequest
0 голосов
/ 11 июля 2020
@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 ]

3 голосов
/ 13 июля 2020

Проблема заключается в самом методе StringUtils.isEmpty(), потому что иногда TextUtils.isEmpty (null) возвращает false , тогда вы передаете value как null, тогда вы вызываете метод trim() на значении null, которое вызывает изменение java.lang.NullPointerException метода таким образом, чтобы избежать java.lang.NullPointerException

public static boolean isEmpty(@Nullable String value) {
        return (TextUtils.isEmpty(value) || (value != null && value.trim().isEmpty()));
    }
1 голос
/ 16 июля 2020

Как вы знаете, оператор || вызовет код с обеих сторон (чтобы получить одно истинное значение), а null.trim().. вызовет исключение.

Поскольку ожидаемое поведение метода StringUtils.isEmpty является чтобы генерировать исключение при передаче значения null, поэтому вы должны написать модульный тест, чтобы ожидать исключения со значением null как:

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

здесь excepted используется для утверждения, что это тестовый метод вызывает исключение NullPointerException.

Примечание: Использование метода mock для StringUtils.isEmpty stati c выполняется с помощью PowerMock framework, но это нарушает Цель тестирования - проверить фактическое поведение кода, поэтому используйте рекомендованный выше подход для проверки исключения. Вы можете создать фиктивную входную переменную и фиктивный метод trim, но тогда вы можете просто использовать ненулевую входную строку, никакой разницы не будет.

0 голосов
/ 18 июля 2020

Полное решение, у меня есть- Из-за значений по умолчанию, установленных в app / build.gradle, я получал false, возвращаемый из 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.

0 голосов
/ 11 июля 2020

Может быть вместо: value.trim().isEmpty()
попробуйте это: value.trim().equals("")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...