我应该如何使用JUnit与Mockito进行测试,以查看方法是否对另一个类进行方法调用?

时间:2016-12-08 17:41:03

标签: java unit-testing junit mockito

当我必须测试一个只在其中有方法调用的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%的分支覆盖率)

1 个答案:

答案 0 :(得分:0)

问题是你在这里创建了难以测试的代码。

你知道,拨打System.exit()会以非常不愉快的方式拆除你的单元测试。

你可以这样做:

public interface ShutdownService {
  public void systemExit();
}

然后创建一个"默认"简单地调用System.exit()

的实现

但是对于你的单元测试,你可以改为#34;插入"该界面的模拟版本;并用它来验证预期的呼叫是否发生。

除此之外,你的代码还在做其他事情,使测试变得比必要的更难 - 首先是你有静态方法;然后使用静态字段 inputParser

长话短说:静态可能看起来很方便,但它会严重影响你编写合理的单元测试的能力。

所以,我建议:学习如何创建可测试的代码;例如,通过观看这些videos。然后改进生产代码的设计。因为那时你会发现编写测试变得容易了!

除此之外:合理处理命令行选项更加比这里的天真实现更复杂。除非这是出于学习目的:重新发明轮子。那里有图书馆为你做这种工作。使用其中一个!