Hamcrest에서 목록이 비어 있지 않은지 확인


147

사람이 목록을 사용하여 비어있는 경우 확인하는 방법을 알고 있는지 궁금 assertThat()하고 Matchers?

JUnit을 사용하는 가장 좋은 방법은 다음과 같습니다.

assertFalse(list.isEmpty());

그러나 나는 Hamcrest에서 이것을 할 수있는 방법이 있기를 바랐습니다.



2
@ FabricioLemos 문제 # 97이 해결되어 마스터 git 브랜치로 병합 된 것으로 보입니다. 다음 햄 크레스트 출시 예정 인데요.
rafalmag

@rafalmag 좋은 자리. 내 모든 그리 읽을 수있는 주장을 수정하는 것이 좋을 것이다 1.3이 출시 될 때
andyb

답변:


165

항상있다

assertThat(list.isEmpty(), is(false));

...하지만 나는 그것이 당신이 의미하는 것이 아니라고 추측합니다 :)

또는

assertThat((Collection)list, is(not(empty())));

empty()Matchers클래스 에서 정적입니다 . 캐스팅 할 필요가 참고 listCollection, Hamcrest 1.2의 불안정한 제네릭 덕분에.

hamcrest 1.3과 함께 다음 수입품을 사용할 수 있습니다

import static org.hamcrest.Matchers.empty;
import static org.hamcrest.core.Is.is;
import static org.hamcrest.core.IsNot.*;

6
구문 강조 표시를 변경하여 괄호를 보이지 않게하려면 Hamcrest 코드가 훨씬 더 좋아 보입니다.
skaffman

2
@ tkeE2036 : 그것은 직장에서 Hamcrest의 깨진 제네릭입니다. 때때로 당신은, 컴파일 예를 들어 수 있도록 캐스트 필요assertThat((Collection)list, is(not(empty())));
skaffman

7
이것은 1.3에서 해결
artbristol

14
@ dzieciou 테스트에 실패하면 더 나은 오류 메시지를 제공합니다. 그래서 대신에 expected true but got false당신 같은 것을 얻을expected empty but got [1, 2, 3]
브래드 Cupit

3
당신은 어떤 선택하지 않은 변환을 선호하지 않으며, 정적 수입을 포기하고자하는 경우에, 당신은 같은 방법으로 제네릭을 추가 할 수 있습니다 assertThat(list, Matchers.<String>empty())(가정 목록의 모음 String들)
earcam

77

이것은 Hamcrest 1.3에서 수정되었습니다. 아래 코드는 컴파일하고 경고를 생성하지 않습니다.

// given
List<String> list = new ArrayList<String>();
// then
assertThat(list, is(not(empty())));

그러나 이전 버전을 사용해야하는 경우 버그 대신 empty()다음을 사용할 수 있습니다.

hasSize(greaterThan(0))
( import static org.hamcrest.number.OrderingComparison.greaterThan;또는
import static org.hamcrest.Matchers.greaterThan;)

예:

// given
List<String> list = new ArrayList<String>();
// then
assertThat(list, hasSize(greaterThan(0)));

위의 솔루션에서 가장 중요한 것은 경고를 생성하지 않는다는 것입니다. 최소 결과 크기를 추정하려는 경우 두 번째 솔루션이 훨씬 더 유용합니다.


1
@rogerdpack 여기 있습니다. 1.3 스타일 예제를 추가했습니다. :)
rafalmag

1
그주의 assertThat(list, not(hasSize(0)))될 것입니다 성공 하는 경우 list이다 null반대로,assertThat(list, hasSize(greaterThan(0)))
호세 Andias

5

읽을 수있는 실패 메시지가 표시되면 빈 목록과 함께 일반적인 assertEquals를 사용하여 방해 금지없이 수행 할 수 있습니다.

assertEquals(new ArrayList<>(0), yourList);

예를 들어 달리면

assertEquals(new ArrayList<>(0), Arrays.asList("foo", "bar");

당신은 얻을

java.lang.AssertionError
Expected :[]
Actual   :[foo, bar]

2
빈 목록에 무엇이 남아 있는지 확인하는 것이 정말 좋습니다!
HDave

0

나만의 커스텀 IsEmpty TypeSafeMatcher를 생성하십시오 :

제네릭 문제 1.3가이 메서드 에 대한 큰 문제로 해결 되더라도 메서드가있는 모든 클래스에서 작동합니다 isEmpty()! 뿐만 아니라 Collections!

예를 들어 작동 String합니다!

/* Matches any class that has an <code>isEmpty()</code> method
 * that returns a <code>boolean</code> */ 
public class IsEmpty<T> extends TypeSafeMatcher<T>
{
    @Factory
    public static <T> Matcher<T> empty()
    {
        return new IsEmpty<T>();
    }

    @Override
    protected boolean matchesSafely(@Nonnull final T item)
    {
        try { return (boolean) item.getClass().getMethod("isEmpty", (Class<?>[]) null).invoke(item); }
        catch (final NoSuchMethodException e) { return false; }
        catch (final InvocationTargetException | IllegalAccessException e) { throw new RuntimeException(e); }
    }

    @Override
    public void describeTo(@Nonnull final Description description) { description.appendText("is empty"); }
}

0

이것은 작동합니다 :

assertThat(list,IsEmptyCollection.empty())
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.