Почему 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.*;

Ответ 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(...), и пусть программист объединит их вместе для большей удобочитаемости и разумности.