美文网首页java
用junit测试控制台输入

用junit测试控制台输入

作者: ThomasYoungK | 来源:发表于2017-07-30 15:54 被阅读1533次

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

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

相关文章

  • 用junit测试控制台输入

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

  • Junit单元测试&反射&注解

    本节内容 Junit单元测试 反射 注解 Junit单元测试 测试分类:黑盒测试:不需要写代码,给输入值,看程序是...

  • Junit测试

    今日内容 Junit单元测试 反射 注解 Junit单元测试: 测试分类:1. 黑盒测试:不需要写代码,给输入值,...

  • Java基础补充

    今日内容 Junit单元测试 反射 注解 一、Junit单元测试 测试分类黑盒测试:不需要写代码,给输入值,看程序...

  • IDEA使用JUnit 不能使用Scanner问题解决

    idea 在JUnit 单元测试方法中使用 Scanner 默认情况下会出现一直在跑的问题,无法在控制台输入内容....

  • 2020-08-10Junit单元测试

    测试概述 黑盒测试给定输入值,看程序是否能够输出期望的值 白盒测试(junit)关注程序具体的执行流程 junit...

  • android单元测试

    android基本的测试框架 java测试框架 Junit、Mockito。这两款测试框架用的比较普及,Junit...

  • 单元测试JUnit4--知识点速查

    JUnit4的测试类不再需要继承测试类。 直接IDE支持用JUnit测试。 测试用例@Test目的: 不是用来证明...

  • 凌宇的java之路(2017年1月23日02:05:53)

    [TOC] Junit测试 用junit测试可以不用每次都去写方法,注释方法去测试,提高了效率,如何测试呢,看代码...

  • IDEA配置JUnit进行单元测试

    安装JUnitGenerator V2.0 JUnit可以运行JUnit测试文件,但无法自动生成JUnit测试代码...

网友评论

    本文标题:用junit测试控制台输入

    本文链接:https://www.haomeiwen.com/subject/rvxklxtx.html