Как использовать JUnit и Hamcrest вместе? - PullRequest
85 голосов
/ 06 апреля 2011

Я не могу понять, как JUnit 4.8 должен работать с сопоставителями Hamcrest.В junit-4.8.jar в org.hamcrest.CoreMatchers определены некоторые совпадения.В то же время есть несколько других совпадений в hamcrest-all-1.1.jar в org.hamcrest.Matchers.Итак, куда идти?Должен ли я явно включить JAR Hamcrest в проект и не обращать внимания на совпадения, предоставленные JUnit?

В частности, я заинтересован в empty() matcher и не могу найти его ни в одном из этих jar-файлов.Мне нужно что-то еще?:)

И философский вопрос: почему JUnit включил пакет org.hamcrest в свой собственный дистрибутив вместо того, чтобы побуждать нас использовать оригинальную библиотеку hamcrest?

Ответы [ 8 ]

49 голосов
/ 08 сентября 2011

Если вы используете Hamcrest с версией больше или равной 1.2, то вам следует использовать junit-dep.jar. В этой банке нет классов Hamcrest, поэтому вы избегаете проблем с загрузкой классов.

Начиная с JUnit 4.11, junit.jar сам по себе не имеет классов Hamcrest. Больше нет необходимости в junit-dep.jar.

46 голосов
/ 06 апреля 2011

junit предоставляет новые методы проверки assert, называемые assertThat (), которые используют Matchers и должны предоставить более читаемый тестовый код и лучшие сообщения об ошибках.

Для использования этого есть некоторые основные соответствия, включенные в junit.Вы можете начать с них для базовых тестов.

Если вы хотите использовать больше сопоставителей, вы можете написать их самостоятельно или использовать библиотеку hamcrest.

В следующем примере показано, как использовать пустое сопоставление.в 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 в путь сборки)

24 голосов
/ 06 апреля 2011

Не совсем отвечаю на ваш вопрос, но вам непременно стоит попробовать 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();
    }  
}

РЕДАКТИРОВАТЬ: Maven координаты:

<dependency>
  <groupId>org.easytesting</groupId>
  <artifactId>fest-assert</artifactId>
  <version>1.4</version>
  <scope>test</scope>
</dependency>
17 голосов
/ 13 января 2014

Кроме того, если используется 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>
4 голосов
/ 02 декабря 2014

Поскольку версии все время меняются, я публикую сообщение, чтобы люди знали, что по состоянию на 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>
3 голосов
/ 30 июня 2011

почему JUnit включил пакет org.hamcrest в свой собственный дистрибутив вместо того, чтобы побуждать нас использовать оригинальную библиотеку hamcrest?

Я думаю, это потому, что они хотели, чтобы assertThat был частью JUnit. Таким образом, это означает, что класс Assert должен импортировать интерфейс org.hamcrest.Matcher, и он не может этого сделать, если JUnit не зависит от Hamcrest или не включает (хотя бы часть) Hamcrest. И я думаю, что включение его части было проще, так что JUnit можно было бы использовать без каких-либо зависимостей.

0 голосов
/ 30 сентября 2018

В 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")
}
0 голосов
/ 12 сентября 2015

И JUnit-4.12, и JUnit-Dep-4.10 имеют зависимости Hamcrest в соответствии с соответствующими XML-файлами.

Дальнейшие исследования показывают, что, хотя зависимость была создана в файлах .xml, источник и классы в jar-файлах. Кажется, что это способ исключить зависимость в build.gradle ... проверить его на чистоту.

Просто ф.и.и.

...