繁体   English   中英

如何将JUnit与Mockito结合使用以测试某个方法是否对另一个Class进行了方法调用?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM