Примеры тестов JUnit для обобщенных методов

Извините за потенциально повторяющийся вопрос, но я недавно узнал о дженериках и как бы не понимал, как их следует тестировать.

Вот мой код для метода поиска минимального значения в коллекции:

public static <T> T min(Collection<T> c, Comparator<T> comp) {
  if (c == null || comp == null) {
     throw new IllegalArgumentException("Collection or comparator is null.");
  }
  if (c.isEmpty()) {
     throw new NoSuchElementException("Collection is empty.");
  }
  Iterator<T> itr = c.iterator();
  T min = itr.next();
  if (itr.hasNext()) {
     for (T i : c) {
        if (comp.compare(i, min) < 0) {
           min = i;
        }
     }
  }
  return min;
}

И это минимальный тестовый пример, который я подготовил для этого метода:

public class SelectorTest{

  @Test
  public void min() {
     Comparator<Integer> intSort = new IntegerSort();
     Integer[] test = {2, 8, 7, 3, 4};
     int expected = 2;
     int actual = Selector.min(test, intSort);
     Assert.assertEquals(expected, actual);
  }

  public static class IntegerSort implements Comparator<Integer> {
     public int compare(Integer o1, Integer o2) {
        return Integer.compare(o1, o2);
     }
  }

}

Ошибка компилятора, которую я получаю из этого кода, выглядит следующим образом:

required:java.util.Collection<T>,java.util.Comparator<T>
found: java.lang.Integer[],java.util.Comparator<java.lang.Integer>

Ясно, что аргумент, который я передаю через тестовый пример, - это не то, что нужно передать, но я думаю об этом так: я передаю целочисленный массив, через который есть коллекция, и даю ему конкретный компаратор для целых чисел, как того требует метод min.

Как мне исправить этот тестовый пример, чтобы он эффективно работал таким образом и работал не только с целыми числами, но и с любыми видами Collection, которые может выполнять метод min?

Раньше я никогда успешно не писал обобщенные тестовые примеры, поэтому я не понимаю, как я могу это сделать.

Спасибо!

целочисленный массив не реализует java.util.Collection

samabcde 10.09.2018 03:33
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
114
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваша проблема не имеет ничего общего с дженериками. Вы не можете передать массив в качестве параметра, если метод ожидает Collection. Массивы не реализуют интерфейс коллекции. Если вы передадите экземпляр ArrayList, он должен работать нормально.

В этом было бы больше смысла. Спасибо!

Carcanken 10.09.2018 03:51

Другие вопросы по теме