В посте Улучшение AssertEquals с JUnit и Hamcrest я представил использование Hamcrest с JUnit . Затем я посмотрел на поддержку встроенного ядра Hamcrest JUnit . В этом посте я расскажу, как применять непрофильные сопоставители Hamcrest с JUnit. Эти неосновные сопоставления НЕ включены в JUnit по умолчанию, но доступны путем включения JAR-файла Hamcrest в classpath.
Хотя включение в JUnit основных сопоставителей Hamcrest упрощает их использование, если нужно использовать только основные сопоставители, такое включение может затруднить использование неосновных сопоставителей и является хорошо известной проблемой .
Поскольку неосновные сопоставители Hamcrest не включены в JUnit, необходимо загрузить JAR Hamcrest. Для моих примеров в этом посте я использую hamcrest-all-1.2.jar .
На следующем снимке экрана показаны проблемы с объединением JAR hamcrest-all с обычной библиотекой JUnit ( JUnit 4.10, как предусмотрено в бета-версии NetBeans 7.2 в моем примере). Как показывает моментальный снимок экрана, когда
junit-4.10.jar
включен в библиотеки NetBeans ПЕРЕД hamcrest-all-1.2.jar
, предыдущий рабочий код (из моего предыдущего поста ) ломается. И NetBeans, и компилятор командной строки показывают этот разрыв в этом снимке экрана. Переключение порядка тестовых библиотек таким образом, чтобы библиотека Hamcrest была указана первой, а JUnit JAR указана после нее, приводила к разрыву компилятора в тестовом коде. Это показано на следующем снимке экрана.
Хотя переключение порядка зависимых библиотек так, чтобы JAR Hamcrest был включен до того, как JUnit JAR действительно предотвратит проблему сборки, это, как правило, не является удовлетворительным подходом. Этот подход слишком хрупок для долгосрочной ремонтопригодности. К счастью, есть лучший подход, который JUnit напрямую поддерживает для решения этой проблемы.
Можно загрузить специальный JUnit JAR без Hamcrest. Следующий снимок экрана показывает тот, который я использую в этом примере:
junit-dep-4.10.jar
. -dep
в имени JAR является подсказкой, что он не содержит Hamcrest. Обозначение рядом с JAR на странице загрузки (снимок экрана показан ниже) также указывает на это («Jar без подколенного сухожилия»). С помощью свободной от Hamcrest версии JAR JUnit «dep» я могу включить ее в библиотеки тестов в любое удобное для меня место в связи с JAR Hamcrest и по-прежнему иметь возможность создавать тестовый код. Это гораздо более благоприятный подход, чем полагаться на определенный порядок библиотек тестов. На следующем изображении показан снимок экрана NetBeans и успешная сборка из командной строки, даже если JUnit JAR указан первым.
При использовании соответствующих библиотек (JUnit-dep JAR и Hamcrest «all» JAR) все сопоставители Hamcrest могут использоваться с тестами на основе JUnit. Hamcrest предоставляет множество совпадений, помимо базовых совпадений, которые теперь входят в комплект JUnit. Один из способов получить представление о доступных дополнительных сопоставителях — взглянуть на классы в JAR Hamcrest. Ниже приведен результат выполнения команды
jar tvf
для JAR Hamcrest и удаления многих записей, чтобы оставить некоторые наиболее интересные из них. «Основные» средства сопоставления, как правило, основаны на классах в «основном» пакете, а неосновные средства сопоставления, как правило, основаны на классах во всех других пакетах без «ядра» в их названии.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
4029 Thu May 21 23:21:20 MDT 2009 org /hamcrest/ <strong>core< /strong > /AllOf .java 3592 Thu May 21 23:21:20 MDT 2009 org /hamcrest/ <strong>core< /strong > /AnyOf .java 1774 Thu May 21 23:21:20 MDT 2009 org /hamcrest/ <strong>core< /strong > /CombinableMatcher .java 1754 Thu May 21 23:21:20 MDT 2009 org /hamcrest/ <strong>core< /strong > /DescribedAs .java 1104 Thu May 21 23:21:20 MDT 2009 org /hamcrest/ <strong>core< /strong > /Every .java 2088 Thu May 21 23:21:20 MDT 2009 org /hamcrest/ <strong>core< /strong > /Is .java 1094 Thu May 21 23:21:20 MDT 2009 org /hamcrest/ <strong>core< /strong > /IsAnything .java 2538 Thu May 21 23:21:20 MDT 2009 org /hamcrest/ <strong>core< /strong > /IsCollectionContaining .java 1862 Thu May 21 23:21:20 MDT 2009 org /hamcrest/ <strong>core< /strong > /IsEqual .java 2882 Thu May 21 23:21:20 MDT 2009 org /hamcrest/ <strong>core< /strong > /IsInstanceOf .java 1175 Thu May 21 23:21:20 MDT 2009 org /hamcrest/ <strong>core< /strong > /IsNot .java 1230 Thu May 21 23:21:20 MDT 2009 org /hamcrest/ <strong>core< /strong > /IsNull .java 960 Thu May 21 23:21:20 MDT 2009 org /hamcrest/ <strong>core< /strong > /IsSame .java 675 Thu May 21 23:21:20 MDT 2009 org /hamcrest/ <strong>core< /strong > /StringContains .java 667 Thu May 21 23:21:20 MDT 2009 org /hamcrest/ <strong>core< /strong > /StringEndsWith .java 678 Thu May 21 23:21:20 MDT 2009 org /hamcrest/ <strong>core< /strong > /StringStartsWith .java 2557 Thu May 21 23:21:20 MDT 2009 org /hamcrest/collection/IsArray .java 1805 Thu May 21 23:21:20 MDT 2009 org /hamcrest/collection/IsArrayContaining .java 1883 Thu May 21 23:21:20 MDT 2009 org /hamcrest/collection/IsArrayContainingInAnyOrder .java 1765 Thu May 21 23:21:20 MDT 2009 org /hamcrest/collection/IsArrayContainingInOrder .java 1388 Thu May 21 23:21:20 MDT 2009 org /hamcrest/collection/IsArrayWithSize .java 1296 Thu May 21 23:21:20 MDT 2009 org /hamcrest/collection/IsCollectionWithSize .java 812 Thu May 21 23:21:20 MDT 2009 org /hamcrest/collection/IsEmptyCollection .java 866 Thu May 21 23:21:20 MDT 2009 org /hamcrest/collection/IsEmptyIterable .java 1086 Thu May 21 23:21:20 MDT 2009 org /hamcrest/collection/IsIn .java 3426 Thu May 21 23:21:20 MDT 2009 org /hamcrest/collection/IsIterableContainingInAnyOrder .java 3479 Thu May 21 23:21:20 MDT 2009 org /hamcrest/collection/IsIterableContainingInOrder .java 993 Thu May 21 23:21:20 MDT 2009 org /hamcrest/collection/IsIterableWithSize .java 1899 Thu May 21 23:21:20 MDT 2009 org /hamcrest/collection/IsMapContaining .java 1493 Thu May 21 23:21:20 MDT 2009 org /hamcrest/collection/IsMapContainingKey .java 1421 Thu May 21 23:21:20 MDT 2009 org /hamcrest/collection/IsMapContainingValue .java 1380 Thu May 21 23:21:20 MDT 2009 org /hamcrest/number/IsCloseTo .java 2878 Thu May 21 23:21:20 MDT 2009 org /hamcrest/number/OrderingComparison .java 1082 Thu May 21 23:21:20 MDT 2009 org /hamcrest/object/HasToString .java 918 Thu May 21 23:21:20 MDT 2009 org /hamcrest/object/IsCompatibleType .java 2080 Thu May 21 23:21:20 MDT 2009 org /hamcrest/object/IsEventFrom .java 1164 Thu May 21 23:21:20 MDT 2009 org /hamcrest/text/IsEmptyString .java 1389 Thu May 21 23:21:20 MDT 2009 org /hamcrest/text/IsEqualIgnoringCase .java 2058 Thu May 21 23:21:20 MDT 2009 org /hamcrest/text/IsEqualIgnoringWhiteSpace .java 1300 Thu May 21 23:21:20 MDT 2009 org /hamcrest/text/StringContainsInOrder .java 4296 Thu May 21 23:21:20 MDT 2009 org /hamcrest/xml/HasXPath .java |
Предоставление JUnit JAR без встроенного в Hamcrest автоматически (JAR «dep») позволяет разработчикам более тщательно создавать свои пути к классам, если для использования с JUnit желательно использовать совпадения Hamcrest выше и за пределами «базовых» соответствий.
Ссылка: Переезд за пределы основного Hamcrest в JUnit от нашего партнера по JCG Дастина Маркса в блоге Inspired by Actual Events .