Почему JUnit не предоставляет методы assertNotEquals?
Кто-нибудь знает, почему JUnit 4 предоставляет методы assertEquals(foo,bar)
, но не assertNotEqual(foo,bar)
?
Он предоставляет assertNotSame
(соответствует assertSame
) и assertFalse
(соответствует assertTrue
), поэтому кажется странным, что они не беспокоились, включая assertNotEqual
.
Кстати, я знаю, что JUnit-addons предоставляет методы, которые я ищу. Я просто спрашиваю из любопытства.
Ответы
Ответ 1
Я бы предложил использовать новый assertThat()
стиль, который может легко описать все виды отрицаний и автоматически построить описание что вы ожидали и что получили, если утверждение не выполнено:
assertThat(objectUnderTest, is(not(someOtherObject)));
assertThat(objectUnderTest, not(someOtherObject));
assertThat(objectUnderTest, not(equalTo(someOtherObject)));
Все три варианта эквивалентны, выберите тот, который вы найдете наиболее читаемым.
Чтобы использовать простые имена методов (и разрешить этот синтаксис времени), вам нужны эти импорт:
import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;
Ответ 2
В JUnit 4.11 есть assertNotEquals
: https://github.com/junit-team/junit/blob/master/doc/ReleaseNotes4.11.md#improvements-to-assert-and-assume
import static org.junit.Assert.assertNotEquals;
Ответ 3
Интересно то же самое. API Assert не очень симметричен; для проверки того, являются ли объекты одинаковыми, он предоставляет assertSame
и assertNotSame
.
Конечно, писать не так уж долго:
assertFalse(foo.equals(bar));
При таком утверждении единственной информативной частью вывода, к сожалению, является имя тестового метода, поэтому описательное сообщение должно быть сформировано отдельно:
String msg = "Expected <" + foo + "> to be unequal to <" + bar +">";
assertFalse(msg, foo.equals(bar));
Это, конечно, так утомительно, что лучше катить свой assertNotEqual
. К счастью, в будущем это, возможно, будет частью JUnit: JUnit issue 22
Ответ 4
Я бы сказал, что отсутствие assertNotEqual действительно является асимметрией и делает JUnit немного менее обучаемым. Имейте в виду, что это аккуратный случай, когда добавление метода уменьшит сложность API, по крайней мере для меня: Symmetry помогает управлять большим пространством.
Я предполагаю, что причиной упущения может быть то, что слишком мало людей призывают к методу. Тем не менее, я помню время, когда даже assertFalse не существовало; следовательно, у меня есть положительное ожидание того, что метод в конечном итоге может быть добавлен, учитывая, что это не сложно; хотя я признаю, что есть многочисленные обходные пути, даже элегантные.
Ответ 5
Я прихожу на эту вечеринку довольно поздно, но я обнаружил, что форма:
static void assertTrue(java.lang.String message, boolean condition)
можно заставить работать для большинства случаев "не равно".
int status = doSomething() ; // expected to return 123
assertTrue("doSomething() returned unexpected status", status != 123 ) ;
Ответ 6
Очевидная причина, по которой люди хотели assertNotEquals(), состояла в том, чтобы сравнивать встроенные функции, не сначала конвертируя их в полностью раздутые объекты:
Подробный пример:
....
assertThat(1, not(equalTo(Integer.valueOf(winningBidderId))));
....
против.
assertNotEqual(1, winningBidderId);
К сожалению, поскольку Eclipse не включает JUnit 4.11 по умолчанию, вы должны быть подробными.
Caveat Я не думаю, что "1" нужно обернуть в Integer.valueOf(), но поскольку я недавно вернулся из .NET, не рассчитывайте на мою правильность.
Ответ 7
Я работаю над JUnit в среде java 8, используя jUnit4.12
для меня: компилятор не смог найти метод assertNotEquals, даже когда я использовал import org.junit.Assert;
Итак, я изменил assertNotEquals("addb", string);
Assert.assertNotEquals("addb", string);
Итак, если вы столкнулись с проблемой, связанной с assertNotEqual
не распознанной, затем измените ее на Assert.assertNotEquals(,);
, она должна решить вашу проблему
Ответ 8
Лучше использовать Hamcrest для отрицательных утверждений, а не assertFalse, так как в первом отчете теста будет показан diff для отказа утверждения.
Если вы используете assertFalse, вы просто получите сообщение об ошибке утверждения. т.е. потеряли информацию о причине отказа.
Ответ 9
Согласованность по модулю API, почему JUnit не предоставил assertNotEquals()
, по той же причине, почему JUnit никогда не предоставлял такие методы, как
-
assertStringMatchesTheRegex(regex, str)
vs. assertStringDoesntMatchTheRegex(regex, str)
-
assertStringBeginsWith(prefix, str)
vs. assertStringDoesntBeginWith(prefix, str)
то есть. нет конца для предоставления конкретных методов утверждения для тех вещей, которые могут потребоваться в вашей логике утверждения!
Намного лучше предоставить составные тестовые примитивы, такие как equalTo(...)
, is(...)
, not(...)
, regex(...)
, и пусть программист объединит их вместе для большей удобочитаемости и разумности.