5

我在单元测试中使用带有 hamcrest 的 junit,但遇到了一个泛型问题:


assertThat(collection, empty());

我知道无法通过这种方式进行类型推断,并且其中一种解决方案是提供类型提示,但是在使用静态导入时我应该如何输入提示?

4

2 回答 2

3

虽然类型推断没有我们希望的那么强大,但在这种情况下,确实是 API 有问题。它没有充分的理由不必要地限制自己。is-empty 匹配器适用于任何集合,而不仅仅是特定的集合E

假设 API 是这样设计的

public class IsEmptyCollection implements Matcher<Collection<?>>
{
    public static Matcher<Collection<?>> empty()
    {
        return new IsEmptyCollection();
    }
}

然后assertThat(list, empty())按预期工作。

您可以尝试说服作者更改 API。同时你可以有一个包装

@SuppressWarnings("unchecked")
public static Matcher<Collection<?>> my_empty()
{
    return (Matcher<Collection<?>>)IsEmptyCollection.empty();
}
于 2011-07-30T23:09:12.813 回答
0

我不太明白这个问题。这是我使用的方法:

/**
 * A matcher that returns true if the supplied {@link Iterable} is empty.
 */
public static Matcher<Iterable<?>> isEmpty() {
    return new TypeSafeMatcher<Iterable<?>>() {

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

        @Override
        public boolean matchesSafely(final Iterable<?> item) {
            return item != null && !item.iterator().hasNext();
        }
    };
}

我像这样使用它:

List<String> list = new ArrayList<String>();
assertThat(list, isEmpty());

这里的泛型没有问题。

于 2011-07-30T23:31:01.040 回答