使用JUnit 进行单元测试时,有时会遇到被测试方法存在控制台输入的情况,这样在测试时需要不厌其烦地手动输入测试用例,显然违背了自动测试的初衷。
本文简介两种通过输入重定向实现自动测试控制台输入的方法。
代码:
下面是待测试类ReadFromConsole,其中的ReadAndShow为我们要测试的含有控制台输入的方法。
首先简单了解下输入重定向 System.setIn() 方法
Java.lang.System.setIn() 方法重新分配标准输入流
示例
调用input方法,输出
本次调用没有要求从控制台输入语句,直接输出data字符串。
言归正传 讨论我们的解决问题方法:
方案1 当被调用类存在Scanner对象时,可临时创建相关方法使得类内输入被重定向为指定字符串的字节流,如下
需要注意的时,该方法需要在类示例之后,具体方法被调用测试之前调用,即在开始测试待测试方法前设置好输入字节流。
输出结果:
优点为可以在测试不同方法时灵活设置输入流的具体内容;
缺点为需要在被测试类内新增输入流设置方法,在测试完成后需要删除该方法并修改Scanner对象的限制符。
方案2
直接在测试类内重定向输入流,间接改变被调用函数输入流
测试结果:
优点为不需要修改测试函数,直接在测试类中重定向标准输入流,待测类受到影响;
缺点为必须在待测类实例化后测试开始前一次性初始化所有输入字符串,以\n为分隔,在后续测试方法时不能在调用重定向标准输入流,否则会抛出异常。
如果有任何疑问,欢迎添加qq群测试入门到大神 755431660 共同学习~
领取专属 10元无门槛券
私享最新 技术干货