Mockito не работает должным образом с универсальными типами

1

У меня есть следующие константы:

private static final Collection<? extends GrantedAuthority> USER_ROLES = ImmutableSet.of((GrantedAuthority)ROLE_ADMIN);
private static final Collection<? extends GrantedAuthority> CUSTOM_GROUPS = AuthorityUtils.commaSeparatedStringToAuthorityList("SOME_GROUP");

В тесте у меня есть следующее смехотворное условие:

when(mapper.mapAuthorities(CUSTOM_GROUPS)).thenReturn(USER_ROLES);

Mapper в этом случае это класс, который реализует GrantedAuthoritiesMapper весенний интерфейс, который требует реализовать этот метод:

Collection<? extends GrantedAuthority> mapAuthorities(Collection<? extends GrantedAuthority> authorities);

Когда я пытался выполнить это насмешливое условие, я получаю ошибку компиляции:

The method thenReturn(Collection<capture#2-of ? extends GrantedAuthority>) in the type OngoingStubbing<Collection<capture#2-of ? extends GrantedAuthority>> is not applicable for the arguments (Collection<capture#3-of ? extends GrantedAuthority>)

Я могу исправить это, просто перечеркнув это условие с помощью этого:

when(customGroupsMapper.mapAuthorities(CUSTOM_GROUPS)).thenReturn((Collection)USER_ROLES);

Но на самом деле мне не нравится предупреждающее сообщение, которое появится: Collection is a raw type. References to generic type Collection<E> should be parameterized Collection is a raw type. References to generic type Collection<E> should be parameterized.

Может ли кто-нибудь объяснить, почему это происходит, и почему mockito не может соответствовать тем же типам? Есть ли альтернативные способы решения этой проблемы?

Теги:
junit
mockito

1 ответ

0

К сожалению, это не имеет ничего общего с Mockito, но с помощью Java обрабатывает дженерики, то есть с стиранием.

Я рекомендую использовать простой заводский метод:

when(mapper.mapAuthorities(GROUP)).thenReturn(authorities(ROLE1, ROLE2));

@SuppressWarnings("unchecked")
private <T> ImmutableSet<T> authorities(GrantedAuthority... authorities) {
    return (ImmutableSet<T>) ImmutableSet.copyOf(authorities);
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню