Pertanyaan Hamcrest membandingkan koleksi


Saya mencoba membandingkan 2 daftar:

assertThat(actual.getList(), is(Matchers.containsInAnyOrder(expectedList)));

Tapi ide

java: no suitable method found for assertThat(java.util.List<Agent>,org.hamcrest.Matcher<java.lang.Iterable<? extends model.Agents>>)
method org.junit.Assert.<T>assertThat(T,org.hamcrest.Matcher<T>) is not applicable
  (no instance(s) of type variable(s) T exist so that argument type org.hamcrest.Matcher<java.lang.Iterable<? extends model.Agents>> conforms to formal parameter type org.hamcrest.Matcher<T>)
method org.junit.Assert.<T>assertThat(java.lang.String,T,org.hamcrest.Matcher<T>) is not applicable
  (cannot instantiate from arguments because actual and formal argument lists differ in length)

Bagaimana saya harus menulisnya?


76
2018-02-07 10:00


asal


Jawaban:


Jika Anda ingin menegaskan bahwa kedua daftar itu identik, jangan memperumit masalah dengan Hamcrest:

assertEquals(expectedList, actual.getList());

Jika Anda benar-benar berniat untuk melakukan perbandingan tidak sensitif terhadap pesanan, Anda dapat memanggil containsInAnyOrder metode varargs dan memberikan nilai secara langsung:

assertThat(actual.getList(), containsInAnyOrder("item1", "item2"));

(Dengan asumsi bahwa daftar Anda adalah dari String, daripada Agent, untuk contoh ini.)

Jika Anda benar-benar ingin memanggil metode yang sama dengan isi a List:

assertThat(actual.getList(), containsInAnyOrder(expectedList.toArray(new String[expectedList.size()]));

Tanpa ini, Anda memanggil metode dengan argumen tunggal dan membuat Matcher yang mengharapkan untuk mencocokkan Iterable dimana setiap elemen adalah List. Ini tidak dapat digunakan untuk mencocokkan List.

Artinya, Anda tidak bisa menandingi List<Agent> dengan Matcher<Iterable<List<Agent>>, yang merupakan upaya kode Anda.


118
2018-02-07 13:21



Satu-satunya hal yang ingin saya tambahkan ke jawaban @ Joe adalah itu toArray() parameter berlebihan di sini, sehingga Anda dapat menulis perbandingan yang tidak sensitif terhadap pesanan sebagai berikut:

List<Long> actual = Arrays.asList(1L, 2L);
List<Long> expected = Arrays.asList(2L, 1L);
assertThat(actual, containsInAnyOrder(expected.toArray()));

33
2018-03-01 03:25



Untuk melengkapi jawaban @ Joe:

Hamcrest memberi Anda tiga metode utama untuk dicocokkan dengan daftar:

contains Cek untuk mencocokkan semua elemen yang diambil dalam menghitung pesanan, jika daftar memiliki lebih banyak atau lebih sedikit elemen, itu akan gagal

containsInAnyOrder Cek untuk mencocokkan semua elemen dan tidak masalah urutannya, jika daftar memiliki lebih banyak elemen, akan gagal

hasItems Cek hanya untuk objek yang ditentukan tidak masalah jika daftar memiliki lebih banyak

hasItem Cek hanya untuk satu objek tidak masalah jika daftar memiliki lebih banyak

Semuanya dapat menerima daftar objek dan penggunaan equals metode untuk perbandingan atau dapat dicampur dengan matchers lain seperti @borjab disebutkan:

assertThat(myList , contains(allOf(hasProperty("id", is(7L)), 
                                   hasProperty("name", is("testName1")),
                                   hasProperty("description", is("testDesc1"))),
                             allOf(hasProperty("id", is(11L)), 
                                   hasProperty("name", is("testName2")),
                                   hasProperty("description", is("testDesc2")))));

http://hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/Matchers.html#contains (E ...) http://hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/Matchers.html#containsInAnyOrder(java.util.Collection) http://hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/Matchers.html#hasItems (T ...)


10
2018-05-17 16:40



Dengan pustaka Hamcrest yang ada (seperti v.2.0.0.0) Anda terpaksa menggunakan metode Collection.toArray () di Koleksi Anda untuk menggunakan containInAnyOrder Matcher. Jauh lebih baik adalah menambahkan ini sebagai metode terpisah untuk org.hamcrest.Matchers:

public static <T> org.hamcrest.Matcher<java.lang.Iterable<? extends T>> containsInAnyOrder(Collection<T> items) {
    return org.hamcrest.collection.IsIterableContainingInAnyOrder.<T>containsInAnyOrder((T[]) items.toArray());
}

Sebenarnya saya akhirnya menambahkan metode ini ke perpustakaan uji kebiasaan saya dan menggunakannya untuk meningkatkan keterbacaan kasus pengujian saya (karena kurang verbositas).


6
2017-07-08 08:57



Untuk daftar objek Anda mungkin membutuhkan sesuatu seperti ini:

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.allOf;
import static org.hamcrest.beans.HasPropertyWithValue.hasProperty;
import static org.hamcrest.Matchers.is;

@Test
@SuppressWarnings("unchecked")
public void test_returnsList(){

    arrange();

    List<MyBean> myList = act();

    assertThat(myList , contains(allOf(hasProperty("id",          is(7L)), 
                                       hasProperty("name",        is("testName1")),
                                       hasProperty("description", is("testDesc1"))),
                                 allOf(hasProperty("id",          is(11L)), 
                                       hasProperty("name",        is("testName2")),
                                       hasProperty("description", is("testDesc2")))));
}

Menggunakan containsInAnyOrder jika Anda tidak ingin memeriksa urutan objek.

P.S. Setiap bantuan untuk menghindari peringatan yang diunggulkan akan sangat dihargai.


1
2018-03-09 19:00



Pastikan bahwa Objects dalam daftar Anda miliki equals() ditentukan pada mereka. Kemudian

    assertThat(generatedList,is(equalTo(expectedList)));

bekerja.


1
2017-10-12 16:47



Untuk membandingkan dua daftar dengan pesanan yang diawetkan,

assertThat(actualList, contains("item1","item2"));

-3
2017-11-11 17:28