2013-05-26 2 views
1

Я пытаюсь сравнить две строки, используя assertEquals (s1, s2); Я получаю ошибку сравнения <> нуль, ожидаемый в нем. Помогите мне в этом.?Что такое ошибка сравнения, нуль в JUnit?

+2

где код? –

+0

Используйте отладчик, чтобы обе строки были не пустыми. Или распечатайте значения перед их тестированием. – Marvo

+0

Возможно ли, что вы используете символы Юникода, например [здесь] (http://stackoverflow.com/questions/4237581/comparing-unicode-characters-in-junit)? –

ответ

5

(. Вы не можете сказать, какая версия JUnit вы используете, и это может иметь значение ... хотя, вероятно, не)

Это означает, что unit test имеет выражение, которое вычисляется как null как аргумент expectedassertEquals, а аргумент actual не оценивается до null.

Невозможно сказать, что это на самом деле означает, не глядя на ваш код, но это может быть ошибкой в ​​модульном тесте (например, аргументы неправильным образом) или ошибка в тестируемом коде. . или оба. Что касается , почему вы получаете null, это зависит от модульных тестов и/или от кода, который он тестирует. Вам нужно будет провести собственное расследование, посмотрев исходный код, используя отладчик и т. Д.

Обратите внимание, что метод assertEquals (смотри ниже) сравнивает объекты с использованием equals (не ==) и заботится, чтобы избежать бросать NPE это один или оба аргумента null. Таким образом, люди, которые предлагают, чтобы вы тестировали null, сначала не указали точку.

Вот Junit 4,4 код:

static public void assertEquals(String message, Object expected, Object actual) { 
    if (expected == null && actual == null) 
     return; 
    if (expected != null && isEquals(expected, actual)) 
     return; 
    else if (expected instanceof String && actual instanceof String) { 
     String cleanMessage= message == null ? "" : message; 
     throw new ComparisonFailure(cleanMessage, (String)expected, 
            (String)actual); 
    } 
    else 
     failNotEquals(message, expected, actual); 
    } 
} 

private static boolean isEquals(Object expected, Object actual) { 
    return expected.equals(actual); 
} 

Как вы можете видеть, null случаи рассматриваются ...

0

JUnit вызывает метод .equals() для определения равенства в методе assertEquals (Object o1, Object o2). Таким образом, вы определенно безопасны с использованием assertEquals (string1, string2). (Потому что строки являются объектами), если оба объекта не равны нулю. Другой способ оценки его использует assertTrue:

assertTrue(s1.equals(s2)); 
+5

На самом деле рекомендуется использовать assertEquals вместо assertTrue для проверки равенства двух объектов в качестве сообщения, когда утверждение терпит неудачу, легче интерпретировать. –

+1

Это утверждение также вызывает сомнения: * «assertEquals проверяет равенство объектов. Не рекомендуется сравнивать строку с равенством» *. Фактически, 'assertEquals' использует' Object.equals' ... и это ** правильный путь ** для сравнения строк. (Он НЕ использует '==' ... читать код и javadocs.). И если вы действительно говорите о правильном способе использования 'assertTrue': 1), это не очевидно, 2)' assertTrue' - это красная селедка, потому что он ее не использует, а 3) это плохая идея; см. комментарий Пангеи. –

Смежные вопросы