Статьи

Перемещение за пределы основного Hamcrest в Юнит

В посте Улучшение 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 .