Как использовать JUnit и Hamcrest вместе?
Я не могу понять, как JUnit 4.8 должен работать с совместителями Hamcrest. В org.hamcrest.CoreMatchers
есть некоторые шаблоны, определенные внутри junit-4.8.jar
. В то же время в org.hamcrest.Matchers
есть еще несколько совпадений в hamcrest-all-1.1.jar
. Итак, куда идти? Должен ли я явно включать JAR файл hamcrest в проект и игнорировать совпадения, предоставленные JUnit?
В частности, меня интересует совпадение empty()
и не может найти его ни в одной из этих банок. Мне нужно что-то еще?:)
И философский вопрос: почему JUnit включил пакет org.hamcrest
в свой собственный дистрибутив вместо того, чтобы побудить нас использовать оригинальную библиотеку hamcrest?
Ответы
Ответ 1
junit предоставляет новые методы проверки assert с именем assertThat(), который использует Matchers, и должен обеспечивать более читаемый тестовый код и лучшие сообщения об ошибках.
Чтобы использовать это, в junit есть некоторые основные соединители. Вы можете начать с них для базовых тестов.
Если вы хотите использовать больше помощников, вы можете написать их самостоятельно или использовать lib.bmp.
В следующем примере показано, как использовать пустой матчи в ArrayList:
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-all.jar в мой путь сборки)
Ответ 2
Если вы используете Hamcrest с версией, большей или равной 1,2, вам следует использовать junit-dep.jar
. В этой банке нет классов Hamcrest, и поэтому вы избегаете проблем с загрузкой.
Так как JUnit 4.11 сам junit.jar
не имеет классов Хамкреста. Больше не нужно junit-dep.jar
.
Ответ 3
Непосредственно отвечая на ваш вопрос, но вы обязательно должны попробовать FEST-Assert свободно утверждать 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();
}
}
EDIT: координаты Maven:
<dependency>
<groupId>org.easytesting</groupId>
<artifactId>fest-assert</artifactId>
<version>1.4</version>
<scope>test</scope>
</dependency>
Ответ 4
Кроме того, если 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>
Ответ 5
Поскольку версии меняются все время, я публикую, чтобы люди знали, что с 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>
Ответ 6
почему JUnit включил пакет org.hamcrest в свой собственный дистрибутив вместо того, чтобы побудить нас использовать оригинальную библиотеку hamcrest?
Я бы предположил, что, поскольку они хотели, чтобы assertThat
был частью JUnit. Таким образом, класс Assert
должен импортировать интерфейс org.hamcrest.Matcher
, и он не может этого сделать, если JUnit не зависит от Hamcrest или не включает (по крайней мере часть) Hamcrest. И я предполагаю, что часть его была проще, так что JUnit можно было бы использовать без каких-либо зависимостей.
Ответ 7
Оба JUnit-4.12 и JUnit-Dep-4.10 имеют зависимости Hamcrest в соответствии с соответствующими .xml файлами.
Дальнейшее исследование показывает, что хотя зависимость была сделана в файлах .xml, источнике и классах в банках. Кажется, это способ исключить зависимость в build.gradle... проверить его, чтобы все было чисто.
Просто f.y.i.