junit 如何在Java中实现多行System.in?

ee7vknir  于 2022-11-11  发布在  Java
关注(0)|答案(4)|浏览(162)

我想系统。在多行文本中,因为我使用了.nextLine()方法。我会在每次调用.nextLine()后复制粘贴前3行,但我不想每次都返回到我的JUnit。可以吗?

//JUnit code
String input = "GME to the MOOON";
InputStream insert = new ByteArrayInputStream(input.getBytes());
System.setIn(insert);

//Method called in test method
Scanner scannerObj = new Scanner(System.in);
String myString = scannerObj.nextLine();
r6hnlfcb

r6hnlfcb1#

下面是一个简单的例子。在add()方法中,你可以委托一个简单的工厂方法来代替Scanner = new Scanner(System.in));,这个工厂方法可以在测试中被覆盖。类似地,输出端抽象出System.out

import org.junit.Assert;
import org.junit.Test;
import java.util.Scanner;

public class ScanTest {

  static class Calculator {
    Scanner createScanner() {
      return new Scanner(System.in);
    }
    public void add() {
      Scanner scanner = createScanner();
      int sum = 0;
      while (scanner.hasNextLine()) {
        String s = scanner.nextLine();
        sum += Integer.parseInt(s);
      }
      print(String.valueOf(sum));
    }
    void print(String s) {
      System.out.println(s);
    }
  }
  @Test
  public void testSum() {
    String input = "1\n2\n3\n";
    Scanner scanner123 = new Scanner(input);
    StringBuilder result = new StringBuilder();

    Calculator calc = new Calculator() {
      @Override Scanner createScanner() {
        return scanner123;
      }
      @Override void print(String s) {
        result.append(s);
      }
    };
    calc.add();

    Assert.assertEquals("6", result.toString());
  }
}
hfyxw5xn

hfyxw5xn2#

首先,您需要确定您要测试的是什么。
您是在测试使用输入字符串的任何逻辑,还是在测试提示用户输入该字符串的逻辑。
如果您回答“两者都有”,那么请注意,这是两个不同的责任领域,应该分别进行测试,因此如果一个失败,不会影响另一个的测试状态。

  • 示例代码结构 *
static String promptUserForInput(Scanner in) {
    // logic here
}

static void doSomething(String input) {
    // logic here
}

public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    String input = promptUserForInput(in);
    doSomething(input);
}

这样,您现在就可以unit分别测试这两个逻辑了。
这被称为Separation-of-Concerns(SoC)。
main方法未进行单元测试。

xtfmy6hx

xtfmy6hx3#

您可以使用System Lambda进行测试:

@Test
void Scanner_reads_text_from_System_in(
) throws Exception {
  withTextFromSystemIn(
    "GME to the MOON",
    "GME to the MOOON",
    "GME to the MOOOON"
  ).execute(() -> {
      Scanner scanner = new Scanner(System.in);
      assertEquals("GME to the MOON", scanner.nextLine());
      assertEquals("GME to the MOOON", scanner.nextLine());
      assertEquals("GME to the MOOOON", scanner.nextLine());
    });
}

免责声明:我是系统Lambda的作者。

oogrdqng

oogrdqng4#

我发现了一个简单的方法:
1.添加功能代码

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class SimpleProgram004 {
    public static void main(String[] args) {
        try{
            String c;
            BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
            do{
                c = in.readLine();
                System.out.println(c);
                String d = c;
            }while(!c.equals("q"));
        }catch(Exception e){
            System.out.println("catch Exception");
        }
    }
}

1.添加测试代码

import static org.junit.Assert.*;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.PrintStream;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

/**
 * Unit test for simple App. JUnit 4.x.
 */
public class SimpleProgram004Test {
    private final InputStream systemIn = System.in;
    private final PrintStream systemOut = System.out;

    private ByteArrayInputStream testIn;
    private ByteArrayOutputStream testOut;

    @Before
    public void setUpOutput() {
        testOut = new ByteArrayOutputStream();
        System.setOut(new PrintStream(testOut));
    }

    private void setInput(String data) {
        testIn = new ByteArrayInputStream(data.getBytes());
        System.setIn(testIn);
    }

    private String getOutput() {
        return testOut.toString();
    }

    @After
    public void restoreSystemInputOutput() {
        System.setIn(systemIn);
        System.setOut(systemOut);
    }

    @Test // Multiply inputs
    public void testCase1() {
        final String testString = "Hello 1\nq\n";
        setInput(testString);

        SimpleProgram004.main(new String[0]);
        // String a = getOutput();
        assertEquals("Hello 1\r\nq\r\n", getOutput());
    }

    @Test // Multiply inputs
    public void testCase2() {
        final String testString = "Hello 1\nHello 2\nq\nHello 3\n";
        setInput(testString);

        SimpleProgram004.main(new String[0]);
        String a = getOutput();
        assertEquals("Hello 1\r\nHello 2\r\nq\r\n", getOutput());
    }

}

相关问题