【问题标题】:How to write test cases for CLI using junit/mockito如何使用 junit/mockito 为 CLI 编写测试用例
【发布时间】:2017-09-06 09:57:45
【问题描述】:

我需要使用 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 实用程序编写测试用例?

【问题讨论】:

  • 您可以使用提供的设置器更改System.inSystem.out 流。这应该可以提供测试输入并检查输出是否符合预期。
  • 我喜欢你干净可读的代码输入,因此我投了赞成票。但请理解,您的问题接近于“过于宽泛”——您应该始终展示您的努力来解决您的问题。换句话说:如果您的问题确实包含您的一些单元测试想法会更好。

标签: java junit mockito powermock powermockito


【解决方案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);

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

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

【讨论】:

    【解决方案2】:

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

    在高层次上,您需要:

    1. 创建Line类的实例

    2. 为其字段创建模拟,例如CommuncationHeader

    3. 对控制台的模拟调用 - 请参阅 this thread
    4. 模拟对字段的调用',具有所需值的控制台方法/输出并测试/断言LinereadLines 方法为这些值集生成的内容

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-21
      • 1970-01-01
      • 2019-05-24
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      相关资源
      最近更新 更多