使列表比较更简洁

Making a list comparison more concise

我有一个测试发送 returns 一些不同的值到 'subtract' 方法。 第一个列表包含该方法的结果。 第二个列表包含预期的解决方案。 这看起来有点笨重而且看起来 and/or 感觉不是很干净。 有没有办法, 与哈姆克雷斯特, 有相同的测试更简洁? 也许有一个较小的列表声明或直接在断言中有一个列表。

@Test
public void verifySubtractWillReturnCorrectValues() {
    List<Double> results = new ArrayList<Double>(Arrays.asList(
            aCalc.subtract(14, 4), 
            aCalc.subtract(10.0, 1),
            aCalc.subtract(0b1111, 0b0011),
            aCalc.subtract(3.0F, 4.0F),
            aCalc.subtract(1L, 1L)));
    List<Double> solutions = new ArrayList<Double>() {{add(10.0); add(9.0); add(12.0); add(-1.0); add(0.0);}};
    assertThat(results, equalTo(solutions));
}

回答一般问题:'how can I make a concise assertion on the contents of a collection' ...

Hamcrest 可用于使断言更加简洁,例如:

assertThat(results, Matchers.hasItems(10.0, 9.0, 12.0, -1.0, 0.0));

assertThat(results, Matchers.containsInAnyOrder(10.0, 9.0, 12.0, -1.0, 0.0));

AssertJ类似:

assertThat(results).containsExactlyInAnyOrder(10.0, 9.0, 12.0, -1.0, 0.0);

但是,您的测试似乎断言了 subtract() 方法的多个离散输入的输出。您可以单独测试这些,从而完全消除 'assert on a collection' 的问题。例如:

assertThat(aCalc.subtract(14, 4), is(10.0));
assertThat(aCalc.subtract(10.0, 1), is(9.0));
// ... etc

问题似乎是您在一个单元测试方法的上下文中执行了五个实际测试。 将它们分成单独的测试。 虽然明显不那么紧凑, 这种技术明确了每个测试的实际意图。

下面是一些示例代码:

@Test
public void subtractTwoInts()
{
    final Double actualResult;
    final Double expectedResult = 10.0;

    actualResult = aCalc.subtract(14, 4);

    assertEquals(
        expectedResult,
        actualResult);
}

@Test
public void subtractIntFromFloat()
{
    final Double actualResult;
    final Double expectedResult = 9.0;

    actualResult = aCalc.subtract(10.0, 1);

    assertEquals(
        expectedResult,
        actualResult);
}