当我必须测试一个只在其中有方法调用的if else子句时,我遇到了一个问题。
public CLI(String[] input){
cliCheck(input);
}
public static void cliCheck(String[] input){
if (input.length == 0) {
System.out.println("No input");
Help.help();
System.exit(0);
}
if(input.length == 1){
if(input[0] .equals("help") || input[0] == "-h") {
Help.help();
System.exit(0);
}
}
inputParser(input);
}
命令行界面程序开头部分的代码。
当没有输入时,第一个if为真。 当用户键入“help”或“-h”时,第二个if为true。 如果没有,则输入String作为inputParser方法的参数发送。
这就是我到目前为止......
@Test
public void cliCheckTest_Help(){
String[] input = {"help"};
CLI cli = new CLI(input);
Help help = mock(Help.class);
cli.cliCheck(input);
verify(help, times(1)).help();
}
(请告诉我有更好的方法来测试100%的分支覆盖率)
答案 0 :(得分:0)
问题是你在这里创建了难以测试的代码。
你知道,拨打System.exit()
会以非常不愉快的方式拆除你的单元测试。
你可以这样做:
public interface ShutdownService {
public void systemExit();
}
然后创建一个"默认"简单地调用System.exit()
。
但是对于你的单元测试,你可以改为#34;插入"该界面的模拟版本;并用它来验证预期的呼叫是否发生。
除此之外,你的代码还在做其他事情,使测试变得比必要的更难 - 首先是你有静态方法;然后使用静态字段 inputParser
。
长话短说:静态可能看起来很方便,但它会严重影响你编写合理的单元测试的能力。
所以,我建议:学习如何创建可测试的代码;例如,通过观看这些videos。然后改进生产代码的设计。因为那时你会发现编写测试变得容易了!
除此之外:合理处理命令行选项更加比这里的天真实现更复杂。除非这是出于学习目的:不重新发明轮子。那里有图书馆为你做这种工作。使用其中一个!