Java IO、inputstream和Outputstream测试

Java IO、inputstream和Outputstream测试,java,testing,io,Java,Testing,Io,我正在尝试创建一个简单的聊天程序。 最初,我编写这段代码是为了将用户的输入消息保存到文本文件中,具体取决于给定的命令,但我对测试策略一无所知。 我应该只为runUi()编写测试吗?因为这个方法已经包含switch语句,并且在它里面调用了其他方法,或者我应该为所有其他方法编写吗 public class CmdLineUI implements ChatUI, Chat { public static final String WRITE = "write"; public sta

我正在尝试创建一个简单的聊天程序。
最初,我编写这段代码是为了将用户的输入消息保存到文本文件中,具体取决于给定的命令,但我对测试策略一无所知。 我应该只为
runUi()
编写测试吗?因为这个方法已经包含switch语句,并且在它里面调用了其他方法,或者我应该为所有其他方法编写吗

public class CmdLineUI implements ChatUI, Chat {
    public static final String WRITE = "write";
    public static final String READ = "read";
    public static final String EXIT = "exit";
    public static final String ERRORMESSAGE = "unknown command";

    private final PrintStream consoleOutput;
    private final BufferedReader userInput;

    public CmdLineUI(PrintStream os, InputStream is) {
        this.consoleOutput = os;
        this.userInput = new BufferedReader(new InputStreamReader(is));
    }

    public static void main(String[] args) throws Exception {
        PrintStream os = System.out;
        os.println("***Welcome to The ChatSystem:  input: write for chatting ,"
                + "\n    for Reading the messages input: read ,for closing Chat input: exit ***");

        CmdLineUI userCmd = new CmdLineUI(os, System.in);

        userCmd.runUi(System.in, os);
    }



    private String[] readCommands() throws Exception {
        String[] result = new String[1];
        InputStreamReader isr = new InputStreamReader(System.in);
        BufferedReader br = new BufferedReader(isr);
        String commandLinString = null;
        String command = null;

        try {
            System.out.println("> ");

            commandLinString = br.readLine();
            StringTokenizer st = new StringTokenizer(commandLinString);
            command = st.nextToken().trim();
            // msg = st.nextToken();

            System.out.println("command :" + command);
        } catch (IOException e) {
            System.out.println("Exception when reading from comman line" + e.getLocalizedMessage());
        }
        result[0] = command;
        // result[1] = msg;

        return result;
    }

    @Override
    public void writeMessage(String message) throws Exception {
        System.out.println("Start with Writing mood:");

        try {
            File file = new File("/home/sami/Desktop/file.txt");
            InputStreamReader inputStreamReader = new InputStreamReader(System.in); // A stream for reading from the
                                                                                    // console
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader); // Connect InputStreamReader to a
                                                                                    // BufferedReader
            FileWriter fileReader = new FileWriter(file); // A stream that connects to the text file
            BufferedWriter bufferedWriter = new BufferedWriter(fileReader); // Connect the FileWriter to the
                                                                            // BufferedWriter
            String line;
            boolean continuee = true;

            while (!(line = bufferedReader.readLine()).equals("stop")) {
                continuee = false;
                bufferedWriter.write(line);
            }
            // Close the stream
            bufferedWriter.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    @Override
    public void readMessage() throws Exception {
        System.out.println("start with reading mood:");

        File file = new File("/home/sami/Desktop/file.txt");
        FileInputStream fileinputstream = new FileInputStream(file);

        try {
            int oneByte;
            while ((oneByte = fileinputstream.read()) != -1) {
                System.out.write(oneByte);
            }

            System.out.flush();
        } catch (Exception ex) {
            ex.getMessage();
        }

        fileinputstream.close();
    }

    @Override
    public void runUi(InputStream inp, OutputStream outp) throws Exception {
        File file = new File("/home/sami/Desktop/file.txt");
        FileReader filereader = new FileReader(file);
        BufferedReader br = new BufferedReader(filereader);

        // CmdLineUI obj = new CmdLineUI(consoleOutput);
        PrintStream ps = new PrintStream(outp);
        boolean again = true;

        while (again) {
            String[] commandMsg = readCommands();
            String command = commandMsg[0];

            switch (command) {
            case WRITE:
                writeMessage(br.readLine());
                again = true;
                break;

            case READ:
                readMessage();
                again = true;
                break;

            case EXIT:    
                again = false;
                break;

            default:
                ps.println(ERRORMESSAGE);
            }
        }

    }

}
我已经创建了这两个接口 这是第一个

public interface ChatUI {
    public void runUi (InputStream inp, OutputStream outp) throws Exception;
}
第二界面

public interface Chat {
     //First Method 
    public void writeMessage(String message)throws Exception;

    // Second Method
    public void readMessage()throws Exception;
}

为您的
runUi()
方法编写测试,因为在所有其他方法中,您要么从控制台读取并标记输入
字符串,要么向文件写入,要么从文件读取。所有这3种操作都已经过Oracle和/或Java语言开发人员的测试(如果您想了解更多,可以通过谷歌搜索此过程)


检查您的程序流是否按预期工作,并为它们编写测试,不要为那些只调用come Java API,然后除了返回(或写入到某个地方)之外几乎什么都不做的函数而烦恼。

我用不同的方式再次编写了这个程序,我还测试了这些方法:

import java.io.*;
import java.util.*;

public class CmdLineUI implements ChatUI, Chat {

    public static final String WRITE = "write";
    public static final String READ = "read";
    public static final String EXIT = "exit";
    public static final String ERRORMESSAGE = "unknown command";

    private BufferedReader userInput;

    public static void main(String[] args) throws Exception {
        PrintStream os = System.out;
        os.println("***Welcome to The ChatSystem:  input: write for chatting ,"
                + "\n    for Reading the messages input: read ,for closing Chat input: exit ***");

        CmdLineUI userCmd = new CmdLineUI();

        userCmd.runUi(System.in, System.out);

    }

    @Override
    public void writeMessage(String message) throws Exception {
        System.out.println("Start with Writing mode:");
        try {
            File file = new File("/home/sami/Desktop/file.txt");
            InputStreamReader inputStreamReader = new InputStreamReader(System.in); // A stream for reading from the
                                                                                    // console
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader); // Connect InputStreamReader to a
                                                                                    // BufferedReader

            FileWriter fileReader = new FileWriter(file); // A stream that connects to the text file
            BufferedWriter bufferedWriter = new BufferedWriter(fileReader); // Connect the FileWriter to the
                                                                            // BufferedWriter

            String line;
            boolean continuee = true;
            while (!(line = bufferedReader.readLine()).equals("stop")) {
                continuee = false;
                bufferedWriter.write(line);
            }

            // Close the stream
            bufferedWriter.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    @Override
    public void readMessage() throws Exception {
        System.out.println("start with reading mode:");
        File file = new File("/home/sami/Desktop/file.txt");

        BufferedReader br = new BufferedReader(new FileReader(file));
        try {
            String oneByte;
            while ((oneByte = br.readLine()) != null) {
                System.out.println(oneByte);
            }

        }

        catch (Exception ex) {
            ex.getMessage();
        }

    }

    @Override
    public void runUi(InputStream inp, OutputStream outp) throws IOException {
        this.userInput = new BufferedReader(new InputStreamReader(inp));

        BufferedReader br = new BufferedReader(userInput);
        PrintStream ps = new PrintStream(outp);

        CmdLineUI userCmd = new CmdLineUI();

        String commandLinString = null;
        boolean again = true;
        try {
            while (again) {

                System.out.println("> ");
                commandLinString = br.readLine().trim();
                StringTokenizer st = new StringTokenizer(commandLinString);
                String command = st.nextToken();
                // String msg= userCmd.readCommands(command);
                System.out.println("command :" + command);
                switch (command) {

                case WRITE:

                    writeMessage(command);
                    again = true;
                    break;

                case READ:

                    readMessage();

                    again = true;
                    break;
                case EXIT:

                    again = false;
                    break;
                default:
                    ps.println(ERRORMESSAGE);
                }

            }

        } catch (Exception e) {
            System.out.println("Exception when reading from comman line" + e.getLocalizedMessage());

        }

    }

}
下面是测试:

import static org.junit.jupiter.api.Assertions.*;

import org.junit.jupiter.api.Test;

import junit.framework.Assert;

import java.io.*;

class CmdTesting {



    @Test
    void test() throws Exception {
        try {
            CmdLineUI obj = new CmdLineUI();

            InputStream myInputStream = null;

            String unknownCommandString = "hello world";
            String exitString = CmdLineUI.EXIT;

            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            DataOutputStream dos = new DataOutputStream(baos);
            dos.writeUTF(unknownCommandString);

            byte[] inputBytes = baos.toByteArray();

            ByteArrayInputStream bais = new ByteArrayInputStream(inputBytes);
            myInputStream = bais;

            ByteArrayOutputStream myOutputStream = new ByteArrayOutputStream();

            obj.runUi(myInputStream, myOutputStream);

            ByteArrayInputStream outputIS = new ByteArrayInputStream(myOutputStream.toByteArray());

            DataInputStream dis = new DataInputStream(outputIS);

            dis.readUTF();

            String expected = "hello world";

            assertEquals(expected, unknownCommandString);

        } catch (Exception ex) {
            ex.getLocalizedMessage();
        }

    }

    @Test
    public void writeMessage() throws Exception {

        File file = new File("/home/sami/Desktop/file.txt");
        String str = "Hello";

        BufferedWriter writer = new BufferedWriter(new FileWriter(file, true));
        writer.append(' ');
        writer.append(str);

        writer.close();
    }


    @Test
    public void reamessage() throws Exception {
        File file=new File("/home/sami/Desktop/file.txt");

        BufferedReader reader = new BufferedReader(new FileReader(file));
        reader.read();
    }
}