Как намекнуть на вывод типа при использовании статического импорта? - PullRequest
5 голосов
/ 30 июля 2011

Я использую junit с hamcrest в своих модульных тестах, и я столкнулся с общей проблемой:


assertThat(collection, empty());

Мне известно о том, что вывод типов недоступен таким образом, и что одним из решений является предоставление подсказки типа, но как мне ввести подсказку при использовании статического импорта?

Ответы [ 2 ]

3 голосов
/ 31 июля 2011

Хотя вывод типов не так силен, как хотелось бы, в этом случае виноват действительно 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();
}
0 голосов
/ 31 июля 2011

Я не совсем понимаю проблему. Вот метод, который я использую:

/**
 * 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());

Здесь нет проблем с генериками.

...