2013-08-28 2 views
7

Я хочу проверить, что коллекция содержит хотя бы один ненулевой элемент. Я пробовал is(not(empty())), однако это проходит в тесте ниже.Утвердить, что коллекция «содержит хотя бы один ненулевой элемент»

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

Есть ли элегантный/простой способ сделать это?

вещи, которые не работают

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

ответ

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

... 

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

К сожалению, есть bug in Java 1.6, что означает, что вы, возможно, придется разделить его на 2 линии, как описано here, если вы используете 1.6:

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

EDIT Вот FEST Assert например, вы запросили:

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

FEST требует только одного статического импорта, так что вы получите полное автодополнение IDE.

0

Там нет простого способа. Вы должны проверять элементы до тех пор, пока не найдете нулевое значение.

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

Почему downvote? –

+0

выглядит хорошо, хотя вам не нужен первый 'if'. Сдвиг не от меня. –

1

Вы можете попробовать следующее:

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

Как AJB извещения, если вы хотите, чтобы оставили свой массив неизмененным, вы должны использовать итератор и проверьте каждый элемент до конца собрания или не null один.

+0

Дело в том, чтобы проверить, есть ли у него элементы «null». Вы не должны их удалять. –

+1

Дело в том, что «убедитесь, что коллекция содержит хотя бы один ненулевой элемент». – Julien

+1

Вы можете сделать эту работу без удаления элементов «null», сделав копию коллекции (объявите временную коллекцию 'c' и используйте' c.addAll'). Но для этого объема работы вы можете просто использовать итератор. – ajb

1

Я просто столкнулся с той же проблемой и решил ее следующим образом.

Основная идея состоит в том, что если в коллекции есть только null элементов, преобразованных в набор, то он будет содержать только один элемент и будет null. Если это не так, то коллекция содержит хотя бы один ненулевой элемент.

Я написал Сличитель, и попробовал с этим тестом:

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

Конечно, в реальном проекте, сличитель должен быть помещен вместе со своими братьями :)

Надеется, что это помогает.

+0

Nice, многоразовый помощник. –

Смежные вопросы