[英]How should I use JUnit with Mockito to test to see if a method makes a method call to another Class?
当我不得不测试仅在其中包含方法调用的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为true。 当用户键入“ 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%的分支覆盖率)
问题是您在这里创建了难以测试的代码。
您会看到,对System.exit()
调用将以非常不愉快的方式破坏您的单元测试。
您可以改为执行以下操作:
public interface ShutdownService {
public void systemExit();
}
然后创建一个简单地调用System.exit()
的“默认”实现。
但是对于您的单元测试,您可以改为“插入”该接口的模拟版本。 并使用它来验证是否发生了预期的通话。
除此之外,您的代码还在做其他事情,这些事情使测试变得比必要的困难得多-首先要知道您那里有静态方法。 然后使用静态字段 inputParser
。
长话短说: 静态看起来可能很方便,但是它极大地削弱了您编写合理的单元测试的能力。
因此,我的建议是:学习如何创建可测试的代码; 例如通过观看这些视频 。 然后改进生产代码的设计。 因为那样您会发现编写测试变得更加容易!
除此之外, 合理的命令行选项处理比您在此处的幼稚实现要复杂得多。 除非这是学习的目的: 不要重新发明轮子。 那里有图书馆为您做这种工作。 使用其中之一!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.