使用扫描仪对用户输入进行 junit 测试

2022-09-02 02:59:12

我必须在一个类中测试一个方法,该方法使用Scanger类进行输入。

package com.math.calculator;

import java.util.Scanner;

public class InputOutput {

    public String getInput() {
        Scanner sc = new Scanner(System.in);
        return sc.nextLine();
    }
}

我想用JUnit测试它,但不知道该怎么做。

我尝试使用以下代码,但它不起作用。

package com.math.calculator;

import org.junit.Test;

import static org.junit.Assert.assertEquals;

public class InputOutputTest {

    @Test
    public void shouldTakeUserInput() {
        InputOutput inputOutput= new InputOutput();

        assertEquals("add 5", inputOutput.getInput());
    }
}

我也想用Mockito尝试一下(使用mock...什么时候。。。然后返回),但不知道该怎么做。


答案 1

您可以使用方法更改流。System.inSystem.setIn()

试试这个,

@Test
public void shouldTakeUserInput() {
    InputOutput inputOutput= new InputOutput();

    String input = "add 5";
    InputStream in = new ByteArrayInputStream(input.getBytes());
    System.setIn(in);

    assertEquals("add 5", inputOutput.getInput());
}

您刚刚修改了该字段。 基本上是一个从 读取 (因此您在控制台中的输入)但是您只是修改了它,并让系统从提供的读取。因此,它不会再从控制台读取,而是从提供的输入流读取。System.inSystem.inInputStreamconsoleinputstream


答案 2

您可以使用系统规则库的规则为命令行界面编写清晰的测试。TextFromStandardInputStream

public void MyTest {
  @Rule
  public final TextFromStandardInputStream systemInMock
    = emptyStandardInputStream();

  @Test
  public void shouldTakeUserInput() {
    systemInMock.provideLines("add 5", "another line");
    InputOutput inputOutput = new InputOutput();
    assertEquals("add 5", inputOutput.getInput());
  }
}

推荐