首页 > 解决方案 > 类型为 T 的 Java 参数化 JUnit

问题描述

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

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

标签: javajunitjunit4parameterized

解决方案


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

  • 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"}
    };
}

推荐阅读