Подтвердить что ты не робот

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

4b9b3361

Ответ 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.