Как использовать JUnit и Hamcrest вместе?
Я не могу понять, как JUnit 4.8 должен работать с Hamcrest matchers. Есть некоторые сопоставители, определенные внутри junit-4.8.jar на org.hamcrest.CoreMatchers. В то же время есть некоторые другое matchers in hamcrest-all-1.1.jar на org.hamcrest.Matchers. Итак, куда идти? Должен ли я явно включать hamcrest JAR в проект и игнорировать matchers, предоставленные JUnit?
в частности, меня интересует empty() matcher и не может найти его ни в одной из этих банок. Мне нужно что-то еще? :)
и философский вопрос: почему JUnit включен org.hamcrest пакет в свой собственный дистрибутив вместо того, чтобы поощрять нас использовать оригинальную библиотеку hamcrest?
8 ответов:
junit предоставляет новые методы проверки assert с именем assertThat (), которые используют Сопоставители и должны предоставлять более читаемый тестовый код и лучшие сообщения об ошибках.
для использования этого существует несколько основных вычислителей, включенных в JUnit. Вы можете начать с них для основных тестов.
Если вы хотите использовать больше matchers вы можете написать их самостоятельно или использовать Hamcrest lib.
в следующем примере показано, как использовать пустой сопоставитель Коллекции:
package com.test; import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertThat; import java.util.ArrayList; import java.util.List; import org.junit.Test; public class EmptyTest { @Test public void testIsEmpty() { List myList = new ArrayList(); assertThat(myList, is(empty())); } }(Я включил hamcrest-все.jar in my buildpath)
Если вы используете Hamcrest с версией больше или равна 1,2, то вы должны использовать
junit-dep.jar. Этот jar не имеет классов Hamcrest, и поэтому вы избегаете проблем с загрузкой классов.начиная с JUnit 4.11 the
junit.jarсам по себе не имеет классов Hamcrest. В этом нет необходимости
не совсем отвечая на ваш вопрос, но вы обязательно должны попробовать FEST-Assert fluent assertions API. Он конкурирует с Hamcrest, но имеет гораздо более простой API с одним статическим импортом. Вот код cpater С помощью FEST:
package com.test; import java.util.ArrayList; import java.util.List; import org.junit.Test; import static org.fest.assertions.Assertions.assertThat; public class EmptyTest { @Test public void testIsEmpty() { List myList = new ArrayList(); assertThat(myList).isEmpty(); } }редактировать: Maven координаты:
<dependency> <groupId>org.easytesting</groupId> <artifactId>fest-assert</artifactId> <version>1.4</version> <scope>test</scope> </dependency>
кроме того, если используется JUnit 4.1.1 + Hamcrest 1.3 + Mockito 1.9.5, убедитесь, что mockito-all не используется. Он содержит основные классы Hamcrest. Вместо этого используйте mockito-core. Ниже конфигурация работает:
<dependency> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-all</artifactId> <version>1.3</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>1.9.5</version> <scope>test</scope> <exclusions> <exclusion> <artifactId>hamcrest-core</artifactId> <groupId>org.hamcrest</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.1.1</version> <scope>test</scope> <exclusions> <exclusion> <artifactId>hamcrest-core</artifactId> <groupId>org.hamcrest</groupId> </exclusion> </exclusions> </dependency>
поскольку версии меняются все время, я публикую, чтобы люди знали, что по состоянию на 2 декабря 2014 года инструкции по адресу http://www.javacodegeeks.com/2014/03/how-to-test-dependencies-in-a-maven-project-junit-mockito-hamcrest-assertj.html работал на меня. Я не использовал AssertJ, хотя, только эти:
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>1.9.5</version> <scope>test</scope> </dependency> <dependency> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-core</artifactId> <version>1.3</version> <scope>test</scope> </dependency> <dependency> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-library</artifactId> <version>1.3</version> <scope>test</scope> </dependency> <dependency> <groupId>org.objenesis</groupId> <artifactId>objenesis</artifactId> <version>1.3</version> <scope>test</scope> </dependency>
Почему JUnit включил org.пакет hamcrest в свой собственный дистрибутив вместо того, чтобы поощрять нас использовать оригинальную библиотеку hamcrest?
Я бы предположил, что это потому, что они хотели
assertThatбыть частью JUnit. Так что это означаетAssertкласс должен импортироватьorg.hamcrest.Matcherинтерфейс и он не может этого сделать, если JUnit либо зависит от Hamcrest, либо включает (по крайней мере, часть) Hamcrest. И я думаю, что в том числе часть его было проще, так что JUnit будет использоваться без каких-либо зависимостей.
и JUnit-4.12 и JUnit-Dep-4.10 имеет зависимости Hamcrest согласно соответственно .XML-файл.
дальнейшее расследование показывает, что, хотя зависимость была сделана в .xml-файлы, источник и классы в банках. Кажется, это способ исключения зависимости в сборке.градля ... проверял его, чтобы держать все в чистоте.
просто f. y. i.
в 2018 году с использованием самых современных библиотек:
configurations { all { testCompile.exclude group: "org.hamcrest", module: "hamcrest-core" testCompile.exclude group: "org.hamcrest", module: "hamcrest-library" } } dependencies { testCompile("junit:junit:4.12") // testCompile("org.hamcrest:hamcrest-library:1.3") // testCompile("org.hamcrest:java-hamcrest:2.0.0.0") testCompile("org.hamcrest:hamcrest-junit:2.0.0.0") }
Comments