OutputStream的JUnit测试

问题描述 投票:-1回答:1

我正在尝试为writeMessage()方法编写测试。但是我不知道如何开始,因为我需要测试一个OutputStream。这应该像一个小聊天。它应该从控制台读取一条消息,将其写入文本文件,然后打印所有已写入该文件的消息。

这是一个大学项目。

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;

public class ChatIntImplement implements ChatI {

    public static String readMessage() throws IOException, NullPointerException{
        InputStream is = System.in;
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        String message = null;

        try {
            message = br.readLine();

        }catch(IOException ex) {
            System.err.println("couldn't write data (fatal)");
            System.exit(0);
        }
        return message;
    }

    public static void messageToFile(String message) throws IOException {
        try {
        String filename = "savedMessage.txt";
        OutputStream os = new FileOutputStream(filename, true);
        PrintStream ps = new PrintStream(os);
        ps.println(message);
        }catch (FileNotFoundException ex) {
            System.err.println("couldn't open file - fatal");
            System.exit(0);
        }
    }

    public static void showMessages() {
        InputStream is = null;
        try {
        is = new FileInputStream("savedMessage.txt");
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        String message;
        while((message = br.readLine())!= null) {
            System.out.println(message);
        }
        }catch(FileNotFoundException ex) {
            System.err.println("couln't open file -fatal");
            System.exit(0);
        }catch(IOException e) {
            System.err.println("couldn't read data (fatal)");
            System.exit(0);
        }

    }

    @Override
    public void writeMessage(String message){
        try {
        messageToFile(message);
        showMessages();
        }catch (IOException e) {
            System.err.println("couldn't write data (fatal");
            System.exit(0);
        }
    }

    @Override
    public void exit() {
        // TODO Auto-generated method stub

    }

    public static void main(String[] args) {
        ChatIntImplement chat = new ChatIntImplement();
        try {
        String message = readMessage();
        chat.writeMessage(message);
        }catch (IOException e) {
            System.err.println("couldn't write data (fatal");
            System.exit(0);
        }catch (NullPointerException npe) {
            System.err.println("Du hast nichts eingegeben");
            System.exit(0);
        }

    }


    }
java unit-testing testing junit outputstream
1个回答
0
投票

我认为您开始遇到的问题是由于您如何安排课程结构。您所有的方法都是静态的,并且每个方法的依赖关系(例如您正在使用的各种输入和输出流)均根据需要在每个方法中创建。例如,在您的messageToFile(...)方法中:


    OutputStream os = new FileOutputStream(filename, true);

一种更好的项目方法是使用传统的面向对象的类设计来设计您的类,该设计使用名为Dependency Injection的模式>

这里的想法是,实现ChatI接口的类将对输入和输出流以及其他对象使用成员变量,这些变量将在该类的构造函数中初始化。然后,您可以控制,最重要的是,可以从单元测试中访问这些流-也许像这样:

    @Test
    public void givenAMessageString_When() {
      String expectedInput="expectedString";
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
      ChatIntImplement chat = new ChatIntImplement(baos);
      ...
      chat.writeMessage(expectedInput);
      string output = new String(baos.toByteArray());
      assertThat(output).equals(expectedInput);
    }

© www.soinside.com 2019 - 2024. All rights reserved.