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"}
};
}
我正在尝试使用 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"}
};
}