2013-08-28 9 views
7

Chcę sprawdzić, czy kolekcja zawiera co najmniej jeden element inny niż zerowy. Próbowałem is(not(empty())), jednak to przechodzi w teście poniżej.Należy potwierdzić, że kolekcja "Zawiera co najmniej jeden element inny niż pusty"

import org.junit.Test; 

import java.util.ArrayList; 
import java.util.Collection; 

import static org.hamcrest.CoreMatchers.is; 
import static org.hamcrest.MatcherAssert.assertThat; 
import static org.hamcrest.Matchers.empty; 
import static org.hamcrest.Matchers.not; 

public class SandBoxTest { 
    @Test 
    public void shouldTestThis() { 
     Collection<Integer> collection = new ArrayList<Integer>(); 
     collection.add(null); 

     assertThat(collection, is(not(empty()))); 
    } 
} 

Czy istnieje elegancki/prosty sposób na zrobienie tego?

rzeczy, które nie działają

@Test 
public void should(){ 
    Collection<String> collection = new ArrayList(); 
    collection.add("gfas"); 
    collection.add("asda"); 
    assertThat(collection, contains(notNullValue())); 
} 

java.lang.AssertionError: 
Expected: iterable containing [not null] 
    but: Not matched: "asda" 
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20) 

Odpowiedz

6
import static org.hamcrest.MatcherAssert.assertThat; 
import static org.hamcrest.Matchers.*; 

... 

assertThat(collection, hasItem(notNullValue(Integer.class))); 

Niestety, istnieje bug in Java 1.6 oznacza, że ​​może trzeba podzielić ją na 2 linie, jak opisano here jeśli używasz 1.6:

Matcher<Iterable<? super String>> matcher = hasItem(notNullValue(Integer.class)); 
assertThat(collection, matcher); 

EDIT Oto FEST Assert Przykład, o który prosiłeś:

import static org.fest.assertions.api.Assertions.assertThat; 
... 
assertThat(collection).doesNotContainNull(); 

FEST wymaga tylko jednego statycznego importu, aby uzyskać pełne uzupełnianie IDE.

0

Nie ma prosty sposób. Musisz sprawdzić elementy, aż znajdziesz taki, który nie jest pusty.

public boolean hasAtLeastOneNotNull(Collection<?> collection) { 
    Iterator<?> it = collection.iterator(); 
    while(it.hasNext()) { 
     if (it.next() != null) 
      return true; 
    } 
    return false; 
} 
+1

Dlaczego spadamy? –

+0

wygląda teraz dobrze, chociaż nie potrzebujesz pierwszego "jeśli". Zgłoszenie nie jest ode mnie. –

1

Można spróbować wykonać następujące czynności:

public void shouldTestThis() { 
     Collection<Integer> collection = new ArrayList<Integer>(); 
     collection.add(null); 
     collection.removeAll(Collections.singleton(null)); // remove all "null" elements from collection 
     assertThat(collection, is(not(empty()))); 
    } 

As AJB zawiadomień, jeśli chcesz, aby opuścił swoją tablicę niemodyfikowana, należy użyć iterację i sprawdzić każdy element do końca zbierania lub non null one.

+0

Celem jest sprawdzenie, czy ma on elementy "null". Nie powinieneś ich usuwać. –

+1

Celem jest "sprawdzenie, czy kolekcja zawiera co najmniej jeden element inny niż pusty". – Julien

+1

Możesz to zrobić bez usuwania elementów "null", tworząc kopię kolekcji (deklaruj kolekcję tymczasową 'c' i użyj' c.addAll'). Ale w przypadku tej ilości pracy równie dobrze można użyć iteratora. – ajb

1

Po prostu wpadłem na ten sam problem i rozwiązałem go w następujący sposób.

Podstawową ideą jest to, że jeśli kolekcja ma tylko elementy null, przekonwertowane na zestaw, będzie zawierała tylko jeden element i będzie to null. Jeśli nie, kolekcja zawiera co najmniej jeden element inny niż null.

Napisałem dopasowywania i próbował go z tego testu:

import org.hamcrest.Description; 
import org.hamcrest.Factory; 
import org.hamcrest.Matcher; 
import org.hamcrest.TypeSafeMatcher; 
import org.junit.Test; 

import java.util.ArrayList; 
import java.util.Collection; 
import java.util.HashSet; 
import java.util.Set; 

import static org.hamcrest.CoreMatchers.is; 
import static org.hamcrest.CoreMatchers.not; 
import static org.junit.Assert.assertThat; 
import static personal.CollectionOfNullsMatcher.collectionOfNulls; 


public class SimpleTest { 

    @Test 
    public void should_check_collection_for_non_null_values() { 
     Collection<String> testedCollection = new ArrayList<String>(); 
     testedCollection.add(null); 

     assertThat(testedCollection, is(collectionOfNulls())); 

     testedCollection.add("any"); 

     assertThat(testedCollection, is(not(collectionOfNulls()))); 
    } 
} 

class CollectionOfNullsMatcher extends TypeSafeMatcher<Collection> { 

    @Override 
    protected boolean matchesSafely(final Collection collection) { 
     Set<Object> set = new HashSet<Object>(collection); 
     return (set.size() == 1) && (set.toArray()[0] == null); 
    } 

    @Override 
    public void describeTo(final Description description) { 
     description.appendText("collection of nulls"); 
    } 

    @Factory 
    public static <T> Matcher<Collection> collectionOfNulls() { 
     return new CollectionOfNullsMatcher(); 
    } 
} 

oczywiście w prawdziwym projektem, dopasowujący powinny być umieszczone razem z jego braci :)

nadzieję, że to pomaga.

+0

Nice, wielokrotnego użytku matcher. –

Powiązane problemy