JUnit - 针对不同实现的一种测试

G.S*_*sky 4 java junit

我在为我的程序编写测试时遇到了一个小问题。我有一个 SortingAlgorithm 接口,还有一些实现,如 BubbleSort、InsertionSort、QuickSort……

我不想为这些 SortingAlgorithms 实现中的每一个都创建一个测试用例。我想将每个算法类注入一个 TestCase,然后分别为每个算法运行 TestCase。

怎么做?

我的代码:

public class SortingAlorithmTest {

SortingAlgorithm sortingAlgorithm;
final int amount = 50000;
final int delayTime = 0;
int[] numbers;

public SortingAlorithmTest(SortingAlgorithm sortingAlgorithm){
    this.sortingAlgorithm = sortingAlgorithm;
}

@Before
public void setUp() throws Exception {
    Random random = new Random();
    numbers = new int[amount];

    for (int i = 0; i < amount; i++){
        numbers[i] = random.nextInt(Preferences.numberScope);
    }

    AlgorithmDelayer.setDelayTime(delayTime);
}

@Test(expected = NullPointerException.class)
public void passingNullValueTest(){
    sortingAlgorithm.sort(null);
}

@Test(timeout = 1000)
public void sortingSpeedTimeTest() {
    sortingAlgorithm.sort(numbers);
}

@Test
public void correctSortingTest(){
    sortingAlgorithm.sort(numbers);

    for (int i = 0; i < amount - 1; i++){
        assertTrue(numbers[i] <= numbers[i+1]);
    }
}
Run Code Online (Sandbox Code Playgroud)

}

And*_*ner 5

您可以使用参数化测试:

@RunWith(Parameterized.class)
class MyTestClass {
  private final SortingAlgorithm algo;

  public MyTestClass(SortingAlgorithm algo) {
    this.algo = algo;
  }

  @Parameters 
  public static List<Object[]> getParameters() {
    List<Object[]> params = new ArrayList<>();
    // Build your list of parameters somehow.
    params.add(new Object[] { new BubbleSort() });
    params.add(new Object[] { new QuickSort() });
    // ...
    return params;
  }

  @Test
  public void test() {
    // Exercise your algorithm somehow.
  }
}
Run Code Online (Sandbox Code Playgroud)