如何使用junit / mockito编写CLI的测试用例

时间:2017-04-11 06:53:25

标签: java junit mockito powermock powermockito

我需要使用junit和一个模拟框架(如mockito)为下面的代码编写测试用例,这是一个命令行实用程序。

public class Line {
  private final Header header;      

  int readLines()
  { 
    Console con = System.console();
    String message;
    ArrayList<MEnum> mList = new ArrayList<>();
    boolean exit = false;

    while (!exit) {
    message = "";

    System.out.println("Please enter Key");

    mList.clear();

    return 0;
  }
}

是否可以为CLI实用程序编写测试用例?

2 个答案:

答案 0 :(得分:1)

另一个答案提供了很好的提示,但缺少一个关键点:您可以改进设计,使您的生产代码更容易测试。

你的问题是你在这里混淆了责任:readLines()应该有“核心”功能;然后,需要提供命令行界面。你把所有这些都推到一个方法中;这使得很难来测试该方法。

相反;您可以将方法更改为:

void processLines(List<String> keys, List<String> modules)   { 
...

含义:您可以直接向该方法提供该输入,而不是向方法的用户内部请求输入。现在您不需要模拟控制台或其他任何东西。你有一个接收两个列表的方法;当使用依赖注入时;您可以轻松验证通信/标头对象是否看到了您期望的呼叫;取决于您的测试为该方法提供的输入。

然后;当所有这些都有效时,你可以编写一个小帮助类,如:

public static void main....
  List<String> keys = new ArrayList<>();
  ... loop code asking user for his input ...
  someLine.processLines(keys, modules);

即使这可以进行单元测试;但如果你真的保持这么简单的水平;你可能不需要那个 - 因为你可以直接在命令上调用它。

长话短说:当你感觉你的生产代码难以测试时,那是因为首先是“糟糕的设计”。当代码难以测试时,也很难修复,增强或重用。您的方法仅适用于提供输入的用户的上下文。我的版本也可以直接用于其他场景。如上所述:测试会容易得多。

答案 1 :(得分:0)

请参阅Vogella教程,并详细解释使用Mockito进行单元测试的基本知识

在高级别,你需要:

  1. 创建Line class

  2. 的实例
  3. CommuncationHeader类等字段创建模拟

  4. 模拟调用控制台 - 请参阅this thread
  5. 模拟调用字段&#39;,使用所需值/输出的控制台方法,并测试/断言LinereadLines方法为这些值生成的方法