【问题标题】:JUnit testing of OutputStreamOutputStream 的 JUnit 测试
【发布时间】:2019-11-06 22:58:14
【问题描述】:

我正在尝试为 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 API,它已经过测试,因此您不是在测试 FileOutputStream 是否有效,那么您想要/需要测试的究竟是什么?如果要编写带有单元测试的代码,则需要以“单元”编写代码,以便可以测试“单元”。您要在这里测试什么“单元”功能?
  • 仅供参考: messageToFile 方法未能通过视觉测试,因为我们可以看到它不能正常工作,因为它没有不要关闭FileOutputStream。但是,我们不需要单元测试来告诉我们这一点,因为任何好的 IDE 在我们编写代码时都会警告我们这一点。
  • @FailingCoder “你必须先创建一个文件才能输出。” 嗯? new FileOutputStream(filename, true) 创建文件,用于输出。您不必先创建文件。
  • 问题是,我什至应该在实现方法之前编写测试。(我们教授的要求。)所以方法是否正常工作并不重要,我只需要编写一个测试它。我想测试方法 writemessage()。想象一下,我们没有实现。它应该像一个黑盒测试。该方法应该获取一个字符串并将其写入 .txt 文件,然后在控制台中显示所有消息。

标签: java unit-testing testing junit outputstream


【解决方案1】:

我认为您开始遇到的问题是因为您的课程结构。您的所有方法都是静态的,并且每个方法的依赖项,例如您正在使用的各种输入和输出流,都是根据需要在每个方法中创建的。例如,在你的 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);
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-23
    • 1970-01-01
    • 2023-04-08
    • 2010-11-10
    • 2016-08-21
    • 2010-10-15
    相关资源
    最近更新 更多