Java 输出流持久性问题

Java 输出流持久性问题,java,junit,Java,Junit,在使用控制台输入测试Java程序时,我创建了ByteArrayOutputStream,并将其设置为用于测试的系统。第一个测试执行正确,输出和输入流看起来不错。但是,当第二个测试执行时,输入流没有正确捕获,我不确定为什么 我尝试过在类构造函数和析构函数中刷新和关闭输出流。清空初始化输入流 主要 import java.io.*; 公营小麦{ 私有静态字符串[]三种类型={“”//忽略0。 “不等边”、“等腰”、“等边”、“非有效三角形”}; private static String instr

在使用控制台输入测试Java程序时,我创建了ByteArrayOutputStream,并将其设置为用于测试的系统。第一个测试执行正确,输出和输入流看起来不错。但是,当第二个测试执行时,输入流没有正确捕获,我不确定为什么

我尝试过在类构造函数和析构函数中刷新和关闭输出流。清空初始化输入流

主要

import java.io.*;
公营小麦{
私有静态字符串[]三种类型={“”//忽略0。
“不等边”、“等腰”、“等边”、“非有效三角形”};
private static String instructions=“这是古老的TriTyp程序。\n输入三个表示三角形边长度的整数。\n三角形将被分类为不等边、等腰、等边或无效。\n”;
publicstaticbufferedreader-in=newbufferedreader(newinputstreamreader(System.in));
公共静态void main(字符串[]argv)
{//TriTyp的驱动程序
INTA、B、C;
int T;
System.out.println(说明);
System.out.println(“输入第1面:”);
A=getN();
System.out.println(“输入第2面:”);
B=getN();
System.out.println(“输入第3面:”);
C=getN();
T=三角形(A,B,C);
System.out.println(“结果为:“+triTypes[T]);
}
私有静态int三角形(int-Side1、int-Side2、int-Side3)
{
如果(侧1您的问题在这里:

public static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
在您的测试中,您使用模拟输入创建了一个新的读取器,并用它替换了
System.In
。问题是此静态成员只创建了一次,并且没有被新的模拟替换。这会导致它在后续读取时返回null,默认值为1,从而导致错误的输出

我建议的修复方法是删除static,注入reader,这样就可以替换它,并且只将main用作合成根

public class TriTyp {
    private static String[] triTypes = {"", // Ignore 0.
        "scalene", "isosceles", "equilateral", "not a valid triangle"};
    private static String instructions = "This is the ancient TriTyp program.\nEnter three integers that represent the lengths of the sides of a triangle.\nThe triangle will be categorized as either scalene, isosceles, equilateral\nor invalid.\n";

    private final BufferedReader in;

    public TriTyp(BufferedReader in) {
        this.in = in;
    }

    public static void main(String[] argv) {
        new TriTyp(new BufferedReader(new InputStreamReader(System.in))).run();
    }

    public void run() {
        int A, B, C;
        int T;

        System.out.println(instructions);
        System.out.println("Enter side 1: ");
        A = getN();
        System.out.println("Enter side 2: ");
        B = getN();
        System.out.println("Enter side 3: ");
        C = getN();
        T = triang(A, B, C);

        System.out.println("Result is: " + triTypes[T]);
    }

    // Triang and getN methods. Just drop their static keyword.
}
在测试中,您将替换此:

String mockinput = "3\r\n3\r\n3";
ByteArrayInputStream in = new ByteArrayInputStream(mockinput.getBytes());
// Set up mock user input stream
System.setIn(in);

// Initialize the TriTyp.main(input) method
String[] mainin = {};
TriTyp.main(mainin);
为此:

String mockinput = "3\r\n3\r\n3";
ByteArrayInputStream in = new ByteArrayInputStream(mockinput.getBytes());
new TriTyp(new BufferedReader(new InputStreamReader(in))).run();

这对我来说很有效,我试图尽可能少地修改TriTyp main,但这是一个逻辑性很强的方法,可以进行注入。谢谢