AssertEquals не работает без второго параметрирования
Люди, почему я получаю "Метод assertEquals (String, Object, Object) неоднозначен для ошибки типа DictionaryTest для этого теста JUnit?
@Test
public void testEditCard() {
Integer a = 10;
Integer b = 12;
Integer c = 2;
assertEquals("test", a-b, c);
}
Добавление кастинга assertEquals("test", (Integer)(a-b), c);
устраняет проблему.
Ответы
Ответ 1
Из-за чудес автобоксинга и -unboxing:
assertEquals("test", /* this is an int */ a-b, /* this is an Integer */ c);
Может быть оценен как
assertEquals(String, long, long);
// in this case the second parameter is unboxed
// (and the first one silently casted)
или
assertEquals(String, Object, Object);
// in this case the first parameter is boxed
Если вы объявляете все переменные как int (не Integer), не должно быть двусмысленности.
Ответ 2
Это потому, что компилятор не может определить, хотите ли вы вызвать assertEquals(String, Object, Object)
или assertEquals(String, long, long)
. Поскольку a-b
и c
могут быть автоматически принудительно привязаны к long
, компилятор видит двусмысленность.
Ваше явное приведение говорит компилятору, что вы хотите версию Object.
Обратите внимание, что в этом случае вы могли бы использовать переменные int
, а не Integer
, которые также фиксировали бы двусмысленность.