用junit测试控制台输入

今天我写了一个键盘类的输入功能,这个类长这样,它继承自一个键盘接口。

public interface KeyBoard {
    String input();
}
public class KeyBoardImpl implements KeyBoard {
    @Override
    public String input() {
        Scanner sc = new Scanner(System.in);
        String input = sc.nextLine();
        return input;
    }
}

为了测试这个类的输入功能,我写了这样一个测试用例,用的是junit

public class KeyBoardImplTest {
    KeyBoard keyBoard = new KeyBoardImpl();

    @Test
    public void test() {
        String input = keyBoard.input();
        System.out.println(input);
    }
}

但是我在运行该测试用例后,发现无法在控制台输入任何内容,程序停在那里不动了。



我尝试了一下在main函数里面写个用例,发现能够输入。

public class KeyBoardImpl implements KeyBoard {
    @Override
    public String input() {
        Scanner sc = new Scanner(System.in);
        String input = sc.nextLine();
        return input;
    }

    public static void main(String[] args) {
        KeyBoard keyBoard = new KeyBoardImpl();
        String input = keyBoard.input();
        System.out.printf(input);
    }
}
image.png

这是为啥呢,经过网上搜索,我找到了解决方案,并且大致了解了原因: junit是用例自动化单元测试的,那么控制台输入这个人工操作就应该不会支持,解决方案如下

https://stackoverflow.com/questions/1647907/junit-how-to-simulate-system-in-testing
上面链接中得票最多的一条的基本做法是:把输入流redirect到字符串输入,把要输入的字符串写入,运行测试案例,再把输入流重新设置为控制台输入,我按照这种方法修改了测试用例:

public class KeyBoardImplTest {
    KeyBoard keyBoard = new KeyBoardImpl();

    @Test
    public void testInput() throws Exception {
        String data = "Hello, World!\r\n";
        String input;
        InputStream stdin = System.in;
        try {
            System.setIn(new ByteArrayInputStream(data.getBytes()));
            input = keyBoard.input();
        } finally {
            System.setIn(stdin);
        }
        System.out.println("input is----" + input);
    }
}

运行该测试用例,得到了希望的结果:


image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,268评论 19 139
  • 简介 测试 在软件开发中是一个很重要的方面,良好的测试可以在很大程度决定一个应用的命运。软件测试中,主要有3大种类...
    Whyn阅读 5,915评论 0 2
  • 1.测试与软件模型 软件开发生命周期模型指的是软件开发全过程、活动和任务的结构性框架。软件项目的开发包括:需求、设...
    Mr希灵阅读 22,078评论 7 278
  • 1.测试与软件模型 软件开发生命周期模型指的是软件开发全过程、活动和任务的结构性框架。软件项目的开发包括:需求、设...
    宇文臭臭阅读 6,763评论 5 100
  • 近几天,央视重播了两遍《雍正王朝》,连看两遍,颇有感慨,体会如下: 1.国家繁荣与吏治休戚相关。贪腐亡国,...
    秦希根阅读 556评论 0 0