JUnit ve Hamcrest birlikte nasıl kullanılır?


89

JUnit 4.8'in Hamcrest eşleştiricilerle nasıl çalışması gerektiğini anlayamıyorum. İçeride tanımlanan bazı matchers vardır junit-4.8.jariçinde org.hamcrest.CoreMatchers. Aynı zamanda içeride başka eşleştiriciler de hamcrest-all-1.1.jarvar org.hamcrest.Matchers. Peki nereye gitmeli? Projeye hamcrest JAR'ı açıkça dahil etmeli ve JUnit tarafından sağlanan eşleştiricileri göz ardı etmeli miyim?

Özellikle empty()eşleştirici ile ilgileniyorum ve bu kavanozların hiçbirinde bulamıyorum. Başka bir şeye ihtiyacım var :)

Ve felsefi bir soru: JUnit org.hamcrest, bizi orijinal hamcrest kitaplığını kullanmaya teşvik etmek yerine neden kendi dağıtımına dahil etti?

Yanıtlar:


49

junit, Eşleştiricileri kullanan ve daha okunaklı bir test kodu ve daha iyi hata mesajları sağlayan assertThat () adında yeni check assert yöntemleri sağlar.

Bunu kullanmak için junit'te bulunan bazı çekirdek eşleştiriciler vardır. Temel testler için bunlarla başlayabilirsiniz.

Daha fazla eşleştirici kullanmak istiyorsanız, bunları kendiniz yazabilir veya hamcrest lib'yi kullanabilirsiniz.

Aşağıdaki örnek, bir ArrayList üzerinde boş eşleştiricinin nasıl kullanılacağını gösterir:

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 dosyasını yapı yoluma ekledim)


2
tam olarak nerede org.hamcrest.Matchers.empty()bulunur? Lütfen JAR dosyasına bir bağlantı verebilir misiniz?
yegor256

Hepsini burada bulabilirsiniz: code.google.com/p/hamcrest ve hamcrest-all.jar'ın indirilmesini burada: code.google.com/p/hamcrest/downloads/…
cpater

1
Hamcrest 1.2 gibi görünüyor değil Maven Merkez depoda. Karşılaştığım sorun bu :(
yegor256

5
Hamcrest 1.3 şimdi yayınlandı ve maven merkezinde.
Tom


51

1.2'den büyük veya eşit bir sürüme sahip bir Hamcrest kullanıyorsanız, o zaman junit-dep.jar. Bu kavanozda Hamcrest sınıfı yoktur ve bu nedenle sınıf yükleme sorunlarından kaçınırsınız.

JUnit junit.jar4.11'den beri kendisinin Hamcrest sınıfı yoktur. junit-dep.jarArtık buna gerek yok.


2
JUnit 4.12 gibi görünüyor, artık bir junit-dep.jar yok. Durum bu mu? Ve eğer öyleyse, bağımsız Hamcrest 1.3 kavanozunu kullanmamız mı gerekiyor?
Jeff Evans

1
Her iki sorunun da cevabı: evet.
Stefan Birkner

25

Sorunuzu tam olarak yanıtlamıyor, ancak FEST-Assert akıcı iddialar API'sini kesinlikle denemelisiniz . Hamcrest ile rekabet ediyor, ancak yalnızca bir statik içe aktarmanın gerekli olduğu çok daha kolay bir API'ye sahip. FEST kullanarak cpater tarafından sağlanan kod :

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();
    }  
}

DÜZENLE: Maven koordinatları:

<dependency>
  <groupId>org.easytesting</groupId>
  <artifactId>fest-assert</artifactId>
  <version>1.4</version>
  <scope>test</scope>
</dependency>

3
Az önce iddia kütüphanemi değiştirdim. Hamcrest'ten oldukça memnun kaldım, ancak Junit sorunlu dahil etme konuları ve yazması zor bazı testler (koleksiyon ve jeneriklerle) yüzünden FEST'e aşığım! Paylaşım için teşekkürler.
Guillaume

2
FEST artık aktif değil. FEST'in bir çatalı olan AssertJ'yi kullanın. joel-costigliola.github.io/assertj
user64141

18

Ayrıca, JUnit 4.1.1 + Hamcrest 1.3 + Mockito 1.9.5 kullanılıyorsa, mockito-all'ın kullanılmadığından emin olun. Hamcrest çekirdek sınıflarını içerir. Bunun yerine sahte çekirdek kullanın. Aşağıdaki yapılandırma çalışır:

<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

Sürümler her zaman değiştiğinden, 2 Aralık 2014 itibariyle http://www.javacodegeeks.com/2014/03/how-to-test-dependencies-in adresindeki talimatları insanlara bildirmek için gönderiyorum. -a-maven-project-junit-mockito-hamcrest-assertj.html benim için çalıştı. Yine de AssertJ kullanmadım, sadece bunlar:

<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>

1
Hem hamcrest-core hem de hamcrest-library bağımlılıklarını aynı anda tanımlamaya gerek yoktur, çünkü hamcrest-library halihazırda hamcrest-core'u geçişli bir bağımlılık olarak tanımlamaktadır.
Eugene Maysyuk

3

JUnit, bizi orijinal hamcrest kitaplığını kullanmaya teşvik etmek yerine neden org.hamcrest paketini kendi dağıtımına dahil etti?

Sanırım bunun nedeni assertThatJUnit'in bir parçası olmasını istedikleri için . Bu, Assertsınıfın org.hamcrest.Matcherarayüzü içe aktarması gerektiği anlamına gelir ve JUnit, Hamcrest'e bağlı olmadığı veya Hamcrest'i içermediği (en azından bir kısmını) içermediği sürece bunu yapamaz. Sanırım bir kısmını dahil etmek daha kolaydı, böylece JUnit herhangi bir bağımlılık olmadan kullanılabilirdi.


2

2018'de en modern kütüphaneleri kullanarak:

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

Hem JUnit-4.12 hem de JUnit-Dep-4.10, ilgili .xml dosyalarına göre Hamcrest bağımlılıklarına sahiptir.

Daha fazla araştırma, bağımlılığın .xml dosyalarında yapılmış olmasına rağmen, kavanozlardaki kaynak ve sınıflarda olduğunu göstermektedir. Build.gradle'daki bağımlılığı dışlamanın bir yolu gibi görünüyor ... her şeyi temiz tutmak için test edin.

Sadece bir fyi


1
İkinci paragrafınızı anlamıyorum. Sanırım yazmak istediğin şeyden bazı kelimeleri atlamış olabilirsin?
Dan Getz
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.