如何在junit测试中使用循环和流?

8ehkhllq  于 2021-07-11  发布在  Java
关注(0)|答案(1)|浏览(593)

这个问题在这里已经有答案了

在封闭范围中定义的局部变量日志必须是final或有效final(5个答案)
上个月关门了。
我做了以下测试:

@Test
void verifyCorrectLimitForGroups() throws SQLException {
    AbstractDAO<StudentModel, Long> studentsDAO = new StudentDAO(myDatasource);
    List<StudentModel> students = studentsDAO.findAll();
    for(int a=1;a<11;a++) {
        assertTrue(students.stream().filter(i->i.getGroupID()==a).count()<30);
    }
}

我的目标是测试30岁以下的学生 groupIDs 从1到10从未超过。为此,我决定使用Java8API流和一个简单的for循环。不幸的是,我遇到了一个编译问题: Local variable a defined in an enclosing scope must be final or effectively final. 这是否意味着我不能这样做,我应该找到一个不同的方法?

smtd7mpg

smtd7mpg1#

正如错误所说,lambda表达式中使用的变量需要是“final或effectively final”,并且 a 显然是可变的。一个可能的解决方案是创建一个虚拟变量,该变量在循环的每次迭代中都被重新定义 a 的值,但因此不会发生突变:

for (int a = 1; a < 11; a++) {
    int x = a; // Effectively final
    assertTrue(students.stream().filter(i -> i.getGroupID() == x).count() < 30);
}

相关问题