Java 类型为 T 的参数化 JUnit

Java parameterized JUnit with type T

我正在尝试使用 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)

不确定如何处理未知类型的所有内容。

这就是您获得测试的方式 运行。我做了三个改变

  • MinTest<T> 现在是 MinTest<T extends Comparable<? super T>>,因此 T 匹配 min 方法的类型
  • 修复了列表的类型:List<T> 而不是 List<? extends T>
  • 已初始化列表 (list = new ArrayList<T>();),以便构造函数可以向列表中添加元素。

这就是您的测试 class 的样子。

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 可以 return 一个 Object[][] 数组直接:

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