2015-09-25 2 views
4

Я пытаюсь понять, почему это JUnit утверждение дает мне ошибку времени компиляции:Используя общие ограниченные символы при тестировании карт с JUnit

Map<String, Set<String>> actual = methodToTest(); 
assertThat(result, hasEntry("foo", new HashSet<String>(Arrays.asList("bar")))); 

Если я пишу это так это работает отлично:

Map<String, Set<String>> actual = methodToTest(); 
Set<String> expected = new HashSet<String>(Arrays.asList("bar")); 
assertThat(result, hasEntry("foo", expected)); 

ошибка компилятор из первого примера:

The method assertThat(T, Matcher<? super T>) in the type Assert is not 
applicable for the arguments (Map<String,Set<String>>, Matcher<Map<? 
extends String,? extends HashSet<String>>>) 

HashSet<String> является подтипом Set<String>, так почему же это не работает?

+0

Работает ли он в java8? – ZhongYu

+0

Не уверен, что это было сделано в java 7. – acvcu

+0

["wildcard hell"] (http://bayou.io/draft/Capturing_Wildcards.html#Wildcard_Hell) :) просто отбросил проблему ... – ZhongYu

ответ

4

HashSet<String> - это подтип Set<String> true.

Однако Matcher<Map<String,HashSet<String>>> является не a подмножество Matcher<Map<String,Set<String>>>. Помните, что List<String> не является подтипом List<Object>.

Метод assertThat ожидает аргумент типа Matcher<? super Map<String, Set<String>>>, который несовместим с Matcher<Map<String,HashSet<String>>>.

+1

'hasEntry()' подпись, вероятно, ошибочна. – ZhongYu

Смежные вопросы