2014-11-24 10 views
13

Biorąc pod uwagę, że:hamcrest: jak dopasować tablicę jest podzbiorem innej tablicy?

int[] a = {1, 2, 3, 4}; 
int[] b = {1, 2, 3, 4, 5}; 

Jak Asser że "a" jest podzbiorem "b" przy użyciu hamcrest dopasowujących?

następujące prace

assertThat(Arrays.asList(b), hasItems(a)); 

Ale ponieważ tworzę „a” do „b”, wolałbym zastosować utrzymuje się na „a” jako wartość. Coś

assertThat(a, isSubsetOf(b)); 

Ponadto korzystne jest, aby uniknąć przekształcenia tablicę listy.

+0

robi porządek materia? –

Odpowiedz

17

można użyć kombinacji dopasowującego Every i IsIn:

assertThat(Arrays.asList(a), everyItem(isIn(b))); 

ten sposób sprawdzić, czy każdy element a zawarty jest w b. Upewnij się, że a i b są typu Integer[]. W przeciwnym razie możesz uzyskać nieoczekiwane wyniki.

W najnowszej wersji wymień isIn na in, od pierwszego has been deprecated.

+0

Powyższe jest doskonałym znaleziskiem. Jedyny problem dotyczy obsługi duplikatów. Jeśli "a" zawiera dwie wartości "3", ale "b" zawiera tylko jedną, powyższe daje fałszywy alarm. –

+0

@JohnB Odniosłem wrażenie, że OP nie dba o te duplikaty z powodu sugestii użycia 'assertThat (Arrays.asList (b), hasItems (a)), które również nie obsługuje tej sprawy. Ale masz całkowitą rację, jeśli chcesz, abyś napisał swój własny, bardziej wyrafinowany matcher, jak sugerował @kmmanu. – eee

+0

To działa dla mnie. Ważne jest, aby sprawdzić, czy jest to jego podzbiór. Teraz zignoruję duplikaty. –

2

Stwórz własny niestandardowy matcher, rozszerzając org.hamcrest.TypeSafeMatcher i użyj go w metodzie assertThat(). Można odwołać kod org.hamcrest.collection.IsArrayContaining i stworzyć własny układ dopasowujący

+1

tak, jeśli nie ma opcji już dostępna z hamcrest. –

0

Jeśli assertj jest rozwiązaniem dla Ciebie:

assertThat(b).contains(a); // order doesn't matter 
    assertThat(b).containsSequence(a); // order matters 
Powiązane problemy