2015-04-14 1 views
1

С новым Assert грамматики, при проверке идентичности, можно было бы написатьПочему assertThat (map1, sameInstance (map2)) не разрешено?

Assert.assertThat(obj1, CoreMatchers.sameInstance(obj2)) 

вместо

Assert.assertSame(obj1, obj2) 

Я пытаюсь утверждать идентичность карты. Итак, я пишу

Assert.assertThat(map1, CoreMatchers.sameInstance(map2)) 

где карта типа HashMap<String,String> Но мои тесты не во время компиляции:

Error:(33, 9) error: no suitable method found for assertThat(Map,Matcher<Map<String,String>>) 
method Assert.<T#1>assertThat(String,T#1,Matcher<? super T#1>) is not applicable 
(cannot infer type-variable(s) T#1 
(actual and formal argument lists differ in length)) 
method Assert.<T#2>assertThat(T#2,Matcher<? super T#2>) is not applicable 
(cannot infer type-variable(s) T#2 
(argument mismatch; Matcher<Map<String,String>> cannot be converted to Matcher<? super Map>)) 
where T#1,T#2 are type-variables: 
T#1 extends Object declared in method <T#1>assertThat(String,T#1,Matcher<? super T#1>) 
T#2 extends Object declared in method <T#2>assertThat(T#2,Matcher<? super T#2>) 
Error:(33) error: no suitable method found for assertThat(Map,Matcher<Map<String,String>>) 

Почему не JUnit (или Hamcrest) выяснить, какие согласовани использовать?

+0

Является 'map1' сырой' Map' или 'Map '? Если это сырая «карта», ее, вероятно, не должно быть. – user2357112

+0

Неудача во время выполнения? Это похоже на ошибку времени компиляции. Как объявляются «map1» и «map2»? – Jesper

+0

Упс! Он не работает во время компиляции. –

ответ

1

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

Класс Я пытался тест выглядел примерно так:

public class Response<T>{ 
    public final Map<String, String> map; 
    public final T data; 
} 

Однако, испытание было написано так:

@Test 
public void testStuff() throws Exception { 
    Map<String, String> map = new HashMap<>(); 
    Object data = new Object(); 
    Response target = new Response<>(map, data); 
    assertThat(target.map, sameInstance(map)); 
    assertThat(target.data, sameInstance(data)); 
} 

Ошибка компиляции на самом деле в последней строке, потому что T неизвестен (<?>) компилятору, он не смог найти подходящего совпадения. Я исправил тест, объявив необработанный тип.

@Test 
public void testStuff() throws Exception { 
    Map<String, String> map = new HashMap<>(); 
    Object data = new Object(); 
    Response<Object> target = new Response<>(map, data); 
    assertThat(target.map, sameInstance(map)); 
    assertThat(target.data, sameInstance(data)); 
} 

Но я нахожу это странным, почему компилятор жалуется на предыдущей строке ...

+1

Если вы используете необработанный ответ, его переменные экземпляра также являются необработанными типами, даже если параметры типа 'Response' не задействованы. 'target.map' является сырым, если' target'. – user2357112

+0

Увлекательный! Спасибо за понимание! –

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