Как использовать 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?

502   8  

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

    Ничего не найдено.