Кто-нибудь знает, почему JUnit 4 предоставляет, assertEquals(foo,bar)
но не assertNotEqual(foo,bar)
методы?
Это обеспечивает assertNotSame
(соответствует assertSame
) и assertFalse
(соответствует assertTrue
), поэтому кажется странным, что они не удосужились в том числе assertNotEqual
.
Кстати, я знаю, что JUnit-addons предоставляет методы, которые я ищу. Я просто спрашиваю из любопытства.
Ответы:
Я бы посоветовал вам использовать более новые утверждения
assertThat()
стиля, которые могут легко описать все виды отрицаний и автоматически составить описание того, что вы ожидали и что вы получили, если утверждение не удалось:Все три варианта эквивалентны, выберите наиболее удобный для вас.
Чтобы использовать простые имена методов (и позволить этому временному синтаксису работать), вам необходимо выполнить следующие операции импорта:
источник
assertNotEquals()
.assertNotEqual
", я бы сказал, что это потому, что это специализированное утверждение, которое не нужно так часто, как,assertEquals
следовательно, и будет выражаться через обобщенный типassertFalse
.assertThat
это гораздо более выразительно, чем ограниченный наборassert*
доступных методов. Поэтому вы можете выразить точные ограничения в одной строке, прочитать (почти) как английское предложение и получить значимое сообщение, когда утверждение не выполнено. Конечно, это не всегда убийственная функция, но когда вы несколько раз видели ее в действии, вы увидите, сколько она добавляет.assertThat
это более выразительноassert*
, но я не думаю, что оно более выразительно, чем Java-выражение, которое вы можете поместить внутри и внеassert*
выражения в целом (в конце концов, я могу выразить все что угодно в Java-коде). Это общая проблема, с которой я начал сталкиваться с API-интерфейсами в свободном стиле - каждый из них - это в основном новый DSL, который вы должны изучить (когда мы все уже знаем Java!). Я полагаю, что Хамкрест достаточно повсеместно распространен сейчас, поэтому разумно ожидать, что люди узнают об этом. Я буду играть ...Есть
assertNotEquals
в JUnit 4.11: https://github.com/junit-team/junit/blob/master/doc/ReleaseNotes4.11.md#improvements-to-assert-and-assumeисточник
Интересно же. API Assert не очень симметричен; для проверки, являются ли объекты одинаковыми, он предоставляет
assertSame
иassertNotSame
.Конечно, это не так уж долго писать:
При таком утверждении единственной информативной частью вывода является, к сожалению, название метода тестирования, поэтому описательное сообщение должно формироваться отдельно:
Это, конечно, настолько утомительно, что лучше кататься самостоятельно
assertNotEqual
. К счастью, в будущем это может стать частью выпуска JUnit: JUnit 22источник
Я бы сказал, что отсутствие assertNotEqual действительно является асимметрией и делает JUnit менее обучаемым. Имейте в виду, что это хороший случай, когда добавление метода уменьшит сложность API, по крайней мере для меня: симметрия помогает управлять большим пространством. Я полагаю, что причиной пропуска может быть то, что слишком мало людей зовут этот метод. Тем не менее, я помню время, когда даже assertFalse не существовало; следовательно, у меня есть положительное ожидание, что метод может быть в конечном итоге добавлен, учитывая, что он не сложный; хотя я признаю, что существует множество обходных путей, даже элегантных.
источник
Я прихожу на эту вечеринку довольно поздно, но обнаружил, что форма:
можно заставить работать в большинстве случаев «не равных».
источник
Я работаю над JUnit в среде Java 8, используя jUnit4.12
для меня: компилятор не смог найти метод assertNotEquals, даже когда я использовал
import org.junit.Assert;
Итак, я изменился
assertNotEquals("addb", string);
на
Assert.assertNotEquals("addb", string);
Так что, если вы столкнулись с проблемой, касающейся
assertNotEqual
неопознанного, то измените ее, чтобыAssert.assertNotEquals(,);
решить вашу проблемуисточник
import static org.junit.Assert.*;
и вы сможете использовать все утверждения без имени класса.Очевидная причина, по которой люди хотели assertNotEquals (), заключалась в том, чтобы сравнивать встроенные функции без предварительной конвертации их в полноразмерные объекты:
Подробный пример:
против
К сожалению, поскольку Eclipse по умолчанию не включает JUnit 4.11, вы должны быть многословны.
Предостережение Я не думаю, что '1' нужно заключать в Integer.valueOf (), но, поскольку я только что вернулся из .NET, не рассчитывайте на мою правильность.
источник
Лучше использовать Hamcrest для отрицательных утверждений, а не assertFalse, так как в первом отчете об испытаниях будет показана разница при неудаче утверждений.
Если вы используете assertFalse, вы просто получаете ошибку подтверждения в отчете. т.е. потеряли информацию о причине сбоя.
источник
Обычно я делаю это, когда ожидаю, что два объекта будут равны:
а также:
когда ожидается, что они будут неравными. Я знаю, что это не ответ на ваш вопрос, но это самый близкий, который я могу получить. Это может помочь другим в поиске того, что они могут делать в версиях JUnit до JUnit 4.11.
источник
Я полностью согласен с точкой зрения ОП.
Assert.assertFalse(expected.equals(actual))
это не естественный способ выразить неравенство.Но я бы сказал, что более того
Assert.assertEquals()
,Assert.assertNotEquals()
работает, но не удобно для пользователя документировать то, что на самом деле утверждает тест, и понимать / отлаживать, когда утверждение не выполняется.Так что да, JUnit 4.11 и JUnit 5 предоставляют
Assert.assertNotEquals()
(Assertions.assertNotEquals()
в JUnit 5), но я действительно избегаю их использования.В качестве альтернативы, чтобы утверждать состояние объекта, я обычно использую API-интерфейс сопоставления, который легко анализирует состояние объекта, в котором четко задокументированы намерения утверждений, и который очень удобен для понимания причины ошибки подтверждения.
Вот пример.
Предположим, у меня есть класс Animal, который я хочу протестировать
createWithNewNameAndAge()
метод, метод, который создает новый объект Animal, изменяя его имя и возраст, но сохраняя его любимую еду.Предположим, я использую,
Assert.assertNotEquals()
чтобы утверждать, что оригинальные и новые объекты отличаются.Вот класс Animal с некорректной реализацией
createWithNewNameAndAge()
:JUnit 4.11+ (или JUnit 5) как инструмент для выполнения тестов и утверждения
Тест не проходит, как ожидалось, но причина, представленная разработчику, на самом деле не помогает. Это просто говорит о том, что значения должны отличаться, и выводить
toString()
результат, вызванный фактическимAnimal
параметром:Хорошо, объекты не равны. Но в чем проблема?
Какое поле неправильно оценивается в тестируемом методе? Один ? Два ? Все они ?
Чтобы обнаружить его, вам нужно покопаться в
createWithNewNameAndAge()
реализации / использовать отладчик, в то время как API тестирования был бы гораздо более дружественным, если бы он сделал для нас разницу между ожидаемым и полученным.JUnit 4.11 в качестве тестового прогона и тестовый Matcher API в качестве инструмента подтверждения
Вот тот же сценарий тестирования, но использующий AssertJ (отличный API для проверки соответствия), чтобы установить
Animal
состояние:Конечно, тест все равно не пройден, но на этот раз причина ясно указана:
Мы можем прочитать, что для
Animal::getName, Animal::getAge, Animal::getFavoriteFood
значений возвращаемого Animal мы ожидаем получить следующие значения:но у нас были эти значения:
Итак, мы знаем, где исследуем:
name
иage
не правильно оценили. Кроме того, факт указанияhay
значения в утвержденииAnimal::getFavoriteFood()
позволяет также более точно утверждать возвращаемоеAnimal
. Мы хотим, чтобы объекты не были одинаковыми для некоторых свойств, но не обязательно для всех свойств.Так что, безусловно, использование API-интерфейса для сопоставления является гораздо более понятным и гибким.
источник
Непротиворечивость по модулю API, почему JUnit не предоставил,
assertNotEquals()
является той же самой причиной, по которой JUnit никогда не предоставлял такие методы, какassertStringMatchesTheRegex(regex, str)
противassertStringDoesntMatchTheRegex(regex, str)
assertStringBeginsWith(prefix, str)
противassertStringDoesntBeginWith(prefix, str)
т. е. нет конца предоставлению конкретных методов утверждения для тех вещей, которые вам могут понадобиться в логике утверждения!
Гораздо лучше , чтобы обеспечить компонуемые тестовые примитивы , как
equalTo(...)
,is(...)
,not(...)
,regex(...)
и пусть программист Шт их вместе , а не для более читабельности и здравого смысла.источник