如何使用assertThrows

时间:2018-06-21 15:25:02

标签: unit-testing lambda exception-handling java-8 junit5

我有一个名为“ foo”的函数,该函数生成字符串的ArrayList。 foo始终返回大小为2的非null数组。当我尝试到达超出范围的元素时,应获取“ IndexOutOfBounds”异常。测试方法有两种变体。第二个失败,而第一个正常。您认为是什么导致第二个失败?

我尝试使用assertThrows检查异常,但是它没有按预期工作。

import java.util.ArrayList;

public class fooClass {

    static ArrayList<String> foo (){
        ArrayList<String> arrayOfSize2 = new ArrayList<String>();
        arrayOfSize2.add("x");
        arrayOfSize2.add("y");
        return arrayOfSize2;
    }    
}

以下测试块正在工作

@Test
void testFoo() {
    ArrayList<String> dummyArrayList = FooClass.foo();
    assertEquals("x",dummyArrayList.get(0));
    assertEquals("y",dummyArrayList.get(1));
    assertThrows(IndexOutOfBoundsException.class, () -> dummyArrayList.get(2));
}

但是这个不起作用

@Test
void testFoo() {
    ArrayList<String> dummyArrayList = new ArrayList<String>();
    dummyArrayList=fooClass.foo();
    assertEquals("x", dummyArrayList.get(0));
    assertEquals("y", dummyArrayList.get(1));
    assertThrows(IndexOutOfBoundsException.class, () -> dummyArrayList.get(2));
}

我希望第二个代码的assertThrows的输出也为True,但实际输出为Local variable dummyArrayList defined in an enclosing scope must be final or effectively final

2 个答案:

答案 0 :(得分:2)

我认为您的方法是错误的,因为它也会在偶然的情况下终止,foo()方法返回的列表少于2个元素,即null

我将按以下顺序对其进行测试:

@Test
void testFoo() {
    ArrayList<String> dummyArrayList = FooClass.foo();
    assertNotNull(dummyArrayList);
    assertEquals(2,dummyArrayList.size());
    assertEquals("x", dummyArrayList.get(0));
    assertEquals("y", dummyArrayList.get(1));
}

[edit]或更简单:

@Test
void testFoo() {
    ArrayList<String> dummyArrayList = FooClass.foo();
    assertIterableEquals(Arrays.asList("x", "y"), dummyArrayList);
}

答案 1 :(得分:0)

lambda表达式中使用的变量应有效地最终确定。断言很好,但是lambda在抱怨