Mil*_*son 9 java junit unit-testing switch-statement mockito
我需要测试一个类,以确定在给定某个输入的情况下是否发生了相关操作.代码如下:
protected static void receiveInput() {
String command;
boolean b = true;
Scanner scanner = new Scanner(System.in);
while (b) {
command = scanner.next();
switch(command) {
case "first":
System.out.println("First!");
break;
case "second":
System.out.println("Second!");
break;
case "third":
System.out.println("Third!");
break;
default:
System.out.println("\n***** Invalid *****\n");
}
System.out.println("\n");
}
scanner.close();
}
Run Code Online (Sandbox Code Playgroud)
如果我能以某种方式控制命令字符串并跟踪扫描仪对象,我可能会得到一个非常彻底的单元测试.出于某种原因,我实际上不允许将这两个对象注入此方法的参数.以不同的方式进行此测试有哪些选择?
Mat*_*nam 19
这是使功能更易测试的完美示例.该功能不需要输入,不产生输出,仅通过副作用影响世界,通过标准方式使其完全不可测试.
要重构此函数以使其更易于测试:
然后,函数的调用者可以决定如何提供输入以及如何处理输出.您修改的程序可以请求用户输入,调用该函数,然后打印输出.测试框架可以提供输入列表中的输入以进行测试,并根据预期值检查输出.
除了 MattPutnam 的出色回答之外,还有两个针对您的方法的具体提示。
1.更改为返回字符串
protected static string receiveInput(String arg) {
String result;
String command = arg;
boolean b = true;
while (b) {
switch(command) {
case "first":
result = "first";
break;
case "second":
result = "second";
break;
case "third":
result = "third";
break;
default:
result = "\n ****Invalid*** \n";
}
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
2.我的偏好只是测试是否boolean b属实。如果这是真的,你就知道它有效,如果不是,那就没有。编辑:请注意,这可能很危险,因为您不会检查是否arg一定符合字符串标准,而是检查它是否有可接受的答案。
您要测试当前方法的唯一方法是以某种方式捕获流,正如MattPutnam在评论中回答的那样。