使列表比较更简洁

时间:2018-04-13 14:32:55

标签: java junit junit4 hamcrest

我有一个测试,它发送并向'subtract'方法返回一些不同的值。 第一个列表包含方法的结果。 第二个列表包含预期的解决方案。 这看起来有点笨重,看起来和/或感觉都不干净。 有办法吗? 与Hamcrest, 让同样的测试更简洁? 也许有一个较小的列表声明或直接在断言中有一个列表。

@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));
}

2 个答案:

答案 0 :(得分:0)

回答一般问题:'我怎样才能对集合的内容做一个简洁的断言'......

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()方法断言几个离散输入的输出。您可以单独测试这些,从而完全消除“集合上的断言”的问题。例如:

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

答案 1 :(得分:0)

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

以下是一些示例代码:

@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);
}