Java-параметризованный JUnit с типом T - PullRequest
0 голосов
/ 30 сентября 2018

Я пытаюсь сделать простой пример с параметрами JUnit с поиском минимума списка.Я также пытаюсь заставить это работать с различными типами объектов, но у меня возникают проблемы с этим.Вот что у меня есть:

import static org.junit.Assert.*;
import java.util.*;
import org.junit.*;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

@RunWith (Parameterized.class)
public class MinTest<T> {

    public List<? extends T> list;
    public T min;

    public MinTest(T a, T b, T c) {
        this.list.add(a);
        this.list.add(b);
        this.min = c;
    }

    @Parameters
      public static Collection<Object[]> calcValues()
      {
          return Arrays.asList (new Object [][] {
             // Last value indicates expected value
             {1, 3, 1},
             {"a", "b", "a"}
             }); 
      }

    @Test
    public void minTest() {

        assertTrue("Single element list", min == Min.min(list));
    }

}

Сначала я не могу добавить в список тип T, но я не уверен, как отформатировать входные значения, чтобы они могли обрабатывать объекты любого типа.Также тест жалуется на то, что вызов min не является правильным типом ввода.

Метод min имеет формат:

public static <T extends Comparable<? super T>> T min (List<? extends T> list)

Не уверен, как обрабатывать все с неизвестными типами.

1 Ответ

0 голосов
/ 30 сентября 2018

Так вы можете запустить тест.Я сделал три изменения

  • MinTest<T> теперь MinTest<T extends Comparable<? super T>>, так что T соответствует типу min метода
  • Исправлен тип списка: List<T> вместо List<? extends T>
  • Инициализировал список (list = new ArrayList<T>();), чтобы конструктор мог добавлять элементы в список.

Так будет выглядеть ваш тестовый класс.

import static org.junit.Assert.*;
import java.util.*;
import org.junit.*;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

@RunWith (Parameterized.class)
public class MinTest<T extends Comparable<? super T>> {

    public List<T> list = new ArrayList<T>();
    public T min;

    public MinTest(T a, T b, T c) {
        this.list.add(a);
        this.list.add(b);
        this.min = c;
    }

    @Parameters
    public static Collection<Object[]> calcValues()
    {
        return Arrays.asList (new Object [][] {
            // Last value indicates expected value
            {1, 3, 1},
            {"a", "b", "a"}
        });
    }

    @Test
    public void minTest() {

        assertTrue("Single element list", min == Min.min(list));
    }
}

Кстати, calcValues может возвращать массив Object[][] напрямую:

@Parameters
public static Object [][] calcValues()
{
    return new Object [][] {
        // Last value indicates expected value
        {1, 3, 1},
        {"a", "b", "a"}
    };
}
...