java - 如何在 mockito 测试用例中模拟控制台用户输入

标签 java junit mockito

我想在 junit/mockito 下的测试用例中模拟控制台输入,任何人都可以帮助我。我的源代码:

ConsoleSrc.java

import java.io.Console;

public class ConsoleSrc {
    public static String readFromConsole() {
    String str = null;
    try {  
      Console con = System.console();              
      System.out.println("The console object is: " + con);                        
      str = con.readLine();
      System.out.println("String is : " + str);
    } catch (Exception ex) {
      ex.printStackTrace();
    }

    return str;
  }

  public static void main(String[] args) {
      ConsoleSrc cs = new ConsoleSrc();
      String str = cs.readFromConsole();
      System.out.println("String is : " + str);
  }
}

测试代码ConsoleTest.java

import org.junit.Test;
import static org.junit.Assert.*;

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

public class ConsoleTest {

@Test
public void ConsoleSrcTestSuccess() {

    ConsoleSrc cs =  mock(ConsoleSrc.class);
    when(cs.readFromConsole()).thenReturn("##This is not console##");
    assertEquals(cs, "This is not console");
  }
}

最佳答案

另一个答案是正确的,但最终,您在这里看到的是“设计”问题;并修复它将使您的代码更易于测试。

您的问题源于您想要测试系统控制台这一事实。但这……实际上是一个的想法。

你看,最后,你会想要确保你的程序的一部分有一个“源”,它可以从中“读取”信息。您将该源“固定”为控制台。这似乎合乎逻辑,但实际上是错误的

您想从特定的实现中抽象;相反,您希望尽可能使用接口(interface)或“基类”。例如:java.io.Reader .如果这样做,您可以将代码编写为:

public class ConsoleReader {
  private final Reader source;

  public ConsoleReader() { this ( System.console.reader() ); }
  ConsoleReader(Reader source) { this.source = source; }

以上内容允许您:

  • 使用默认的无参数构造函数创建一个 ConsoleReader 对象;然后它将从 System.console 中读取
  • 但是,您也可以使用other 构造函数,并为您的被测类提供任何 类型的阅读器。例如:由 Mockito 创建的模拟阅读器。

现在您不必在控制台中模拟方法;但你 mock 读者;并且可以自由地模拟该类的任何方法!

长话短说:您的设计不够灵活,也很难测试。答案不是使用模拟框架技巧来规避这个问题;而是改进设计;所以它可以更容易地进行测试!

关于java - 如何在 mockito 测试用例中模拟控制台用户输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43231091/

相关文章:

java - 单击时更改按钮颜色 Android Studio

java - 使用 Java SDK 从我的良好数据项目中导出数据集

java - 你能在同一个 junit 测试中有多个 assertEquals(answer, result) 吗?

java - Mule JUnit 测试 "text/xml"

java - 由另一个类扩展的类的模拟方法

java - with() 和any() 方法做什么?

java - Apache POI 无法应用表格样式

spring-boot - 调试器、@SpringBootTest 和 Gradle

java - Mockito 验证特定的 lambda 是否已作为 mock 方法中的参数传递

java - 带有背景图像和 JPanel 的 JFrame