Укажите универсальный тип класса в параметре соответствия - PullRequest
2 голосов
/ 13 февраля 2012

Рассмотрим следующий фрагмент кода:

final Foo foo = context.mock(Foo.class);

context.checking(new Expectations() {{
    one(foo).someMethod(with(aNonNull(List.class)));
}});

Я пытаюсь предположить, что someMethod вызывается с ненулевым аргументом типа List<Bar>.Однако я не могу понять правильный синтаксис, чтобы указать, что список содержит объекты типа Bar.Следующая упрощенная попытка не является допустимым кодом:

final Foo foo = context.mock(Foo.class);

context.checking(new Expectations() {{
    one(foo).someMethod(with(aNonNull(List<Bar>.class)));
}});

Есть ли правильный способ сделать это, или я вынужден добавить @SuppressWarnings("unchecked") к моему методу тестирования?

IЯ понимаю, что это не совсем вопрос JMock, но я решил пометить его как таковой, чтобы привлечь людей, которые, возможно, сталкивались с этой проблемой в прошлом.

Ответы [ 2 ]

2 голосов
/ 13 февраля 2012

Общая информация стирается во время выполнения [JB] Effective Java SE стр.114. Таким образом, вы должны проверить это по-другому.

Я нашел этот метод для проверки типа всех элементов списка:

final Foo foo = context.mock(Foo.class);

context.checking(new Expectations() {{
    oneOf(foo).someMethod((List<Object>) with(Every.everyItem(IsInstanceOf.instanceOf(Bar.class))));
}});
0 голосов
/ 03 июня 2019

Существуют способы, по крайней мере, централизовать подавление предупреждения. Например, вы можете создать подкласс Expectations:

public static class UncheckedExpectations extends Expectations {
    @SuppressWarnings("unchecked")
    public <T, U extends T> U withUnchecked(Matcher<T> matcher) {
        return (U) super.with(matcher);
    }
}

А затем используйте дополнительные методы:

context.checking(new UncheckedExpectations() {{
    one(foo).someMethod(withUnchecked(aNonNull(List.class)));
}});

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

Конечно, Хамкрест мог заставить их with() работать так же. Обидно, что они этого не сделали, потому что непроверенные предупреждения в коде Hamcrest очень распространены в любой кодовой базе, использующей библиотеку.

...