我有一个名为“ 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
答案 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在抱怨