【问题标题】:java.lang.IllegalStateException: stream has already been operated upon or closed in junitjava.lang.IllegalStateException:流已经在junit中被操作或关闭
【发布时间】:2019-08-29 13:40:13
【问题描述】:

我是 Mockito 的新手,我正在尝试在列表为 null 时抛出 NullPoinerException(),对于这种情况,我使用下面的代码进行测试,但我得到异常 java.lang.IllegalStateException: 流已经被操作或关闭

原创

public List<Employee>getEmployeesListStartWithA(){

        List<Employee>list = new ArrayList<>();
        list.add(new Employee(1, "ram", "ram@gmail.com"));
        list.add(new Employee(2, "santhosh", "santhosh@gmail.com"));
        list.add(new Employee(3, "rita", "rita@gmail.com"));
        list.add(new Employee(4, "ramesh", "ramesh@gmail.com"));
        Stream<Employee>filterList = list.stream().filter(item->{
            return item.getName().startsWith("r");
        });

        if(filterList==null || filterList.collect(Collectors.toList()).size()==0){
           throw new NullPointerException();
        }

        return filterList.collect(Collectors.toList());
    }

测试:

@Test
public void getEmployeesListStartWithATest(){
    List<Employee>list = new ArrayList<>();
    list.add(new Employee(1, "ram", "ram@gmail.com"));
    list.add(new Employee(3, "rita", "rita@gmail.com"));
    list.add(new Employee(4, "ramesh", "ramesh@gmail.com"));
doReturn(null).when(configurationClass).getEmployeesListStartWithA();
    doThrow(new NullPointerException()).when(configurationClass).getEmployeesListStartWithA();

}

【问题讨论】:

    标签: spring junit mockito


    【解决方案1】:

    错误来自你的方法,与测试无关。

    虽然filterListstream,但一旦过滤操作终止,它就会关闭。
    稍后对其进行收集将无法正常工作。

    您可以通过将其更改为以下方式来修复该方法:

    public List<Employee> getEmployeesListStartWithA() {
    
        List<Employee>list = new ArrayList<>();
        list.add(new Employee(1, "ram", "ram@gmail.com"));
        list.add(new Employee(2, "santhosh", "santhosh@gmail.com"));
        list.add(new Employee(3, "rita", "rita@gmail.com"));
        list.add(new Employee(4, "ramesh", "ramesh@gmail.com"));
        List<Employee>filterList = list.stream().filter(item->{
            return item.getName().startsWith("r");
        }).collect(Collectors.toList());
    
        if(filterList==null || filterList.size()==0){
           throw new NullPointerException();
        }
    
        return filterList;
    }
    

    另外我建议你不要抛出NullPointerException。这只是一种糟糕的风格,请改用更合适的异常(或简单地返回一个空列表)。

    【讨论】:

    • 另外我建议你不要抛出 NullPointerException。那只是不好的风格,请改用更合适的异常(或简单地返回一个空列表)。--->那么请指导我的正确方法是什么?
    • 如何为上述方法编写测试用例,请您解释一下
    • 返回一个空列表是最合适的做法。您应该只针对所需的输出进行测试。通过阅读您的测试代码,我不确定您是要测试此方法还是要模拟此方法(当它被另一个类使用时)?
    • 能否请您粘贴一些代码,然后它可能对我有用
    • 你的original 对我来说看起来像是一个硬编码的例子,那不是你要测试的代码,或者?对于real-world 方法,我会假设list 实际上是一个参数以及起始字母? -- 只要我不知道你到底想做什么,那是不可能的,你可以打开一个聊天室,我们在那里继续讨论?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多