2016-10-10 6 views
4

Я имею Map объявленную следующим образом:JUnit assertThat: проверить, что объект равен Строка

Map<String, Object> data 

я положил String в нем и проверить его значение, как это:

assertEquals("value", data.get("key")); 

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

assertThat(data.get("key"), equalTo("value")); 

И, конечно, он не работает из-за несоответствия типа:

Wrong 2nd argument type. Found: 'org.hamcrest.Matcher<java.lang.String>', required: 'org.hamcrest.Matcher<? super java.lang.Object>' less...

Явное приведение типа первого аргумента String помогает , но я бы хотел этого избежать. Например, assertEquals не требует ввода типа. Итак, как я могу проверить, что значение, которое было помещено в объявленный выше объект Map, равно String, используя метод assertThat?

+0

литье data.get в строку может помочь – Stultuske

+0

Да, это помогает. Дело в том, что я хочу избежать явного приведения типов. Ищете способ заставить его работать как assertEquals, но с assertThat. – Lingviston

+0

'Матчи. equalTo ("value") '. –

ответ

1

"более assertThat" способ делать вещи будет:

Map<String, Object> expectedData = Collections.singletonMap("key", "value"); 

asssertThat(data, is(expectedData)); 

Обратите внимание:

  • Может быть, вам нужны подсказки типа для вызова singletonMap
  • Кроме того, является сопоставитель, есть другие сопоставления, которые позволят вам проверить, что данные содержит «ожидаемые» данные карты

Для вашей конкретной проблемы: это вызвано тем, что здесь генерируются дженерики; может быть достаточно использовать (String) data.get("key") - сообщить компилятору, что «фактический» аргумент имеет тип String.

В конце концов, я понятия не имею, в чем проблема. Я записал этот фрагмент кода:

public void test() { 
    Map<String, Object> data = new HashMap<>(); 
    data.put("key", "value"); 
    assertThat(data.get("key"), is("value")); 

    Map<String, Object> expectedData = Collections.singletonMap("key", "value"); 
    assertThat(data, is(expectedData)); 
} 

Он компилируется в порядке, и единичный тест проходит и проходит. Другими словами: на самом деле я не могу воспроизвести вашу проблему.

+0

К сожалению, «есть» имеет ту же проблему, что и «equalsTo». Похоже, я не могу добиться того, чего хочу, без явного приведения типов к String. – Lingviston

+0

См. Мой обновленный ответ. Вещи работают для меня (в обоих направлениях) без кастингов (но если быть точным: использование Java8). В Java7 вывод типа может дать вам проблему; требуя, чтобы вы подали этот бросок. – GhostCat

+0

Хм, снова проверил ваш пример и испытал ту же проблему, что и раньше. Так что это определенно похоже на несоответствие версии ничего. Я продолжу исследование и проверку. – Lingviston