Как смоделировать файловый ввод-вывод в Java? - PullRequest
3 голосов
/ 27 июля 2011

Как мне создать класс MockFile, имитирующий java.io.File w.r.t. файл читать и писать? Я везде использую свои собственные методы вместо new FileInputStream(....) и new FileOutputStream(....), поэтому с этой частью проблем нет (я всегда делегирую соответствующий поток). Нетривиальная часть - это реализация моих MockFileInputStream и MockFileOutputStream в более сложных случаях.

Нет проблем, когда я сначала записываю файл, а затем читаю его, я могу просто использовать ByteArrayOutputStream и так далее. Это просто, но с чередованием операций чтения и записи это не может работать. Есть идея получше, чем написать собственную версию ByteArrayOutputStream?

Ответы [ 2 ]

4 голосов
/ 27 июля 2011

Я бы использовал настоящий файл и реальные FileInputStream и FileOutputStream.В противном случае вы просто выполняете тестовый код: на самом деле довольно бессмысленно.

3 голосов
/ 27 июля 2011

Я создал класс 'WordCounter', который считает слова в файле. Однако я хочу провести модульное тестирование своего кода, и модульные тесты не должны касаться файловой системы.

Таким образом, путем рефакторинга фактического Файлового ввода-вывода (FileReader) в его собственный метод (давайте посмотрим правде в глаза, стандартные классы Java File IO, вероятно, работают, поэтому мы не сильно выигрываем, тестируя их), мы можем проверить нашу логику подсчета слов в изоляции.

import static org.junit.Assert.assertEquals;

import java.io.*;

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

public class WordCounterTest {

    public static class WordCounter {

        public int getWordCount(final File file) throws FileNotFoundException {
            return getWordCount(new BufferedReader(new FileReader(file)));
        }

        public int getWordCount(final BufferedReader reader) {
            int wordCount = 0;
            try {
                String line;
                while ((line = reader.readLine()) != null) {
                    wordCount += line.trim().split(" ").length;
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (reader != null) {
                        reader.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return wordCount;
        }
    }

    private static String TEST_CONTENT = "Neque porro quisquam est qui dolorem\n"
            + " ipsum quia dolor sit amet, consectetur, adipisci velit...";

    private WordCounter wordCounter;

    @Before
    public void setUp() {
        wordCounter = new WordCounter();
    }

    @Test
    public void ensureExpectedWordCountIsReturned() {
        assertEquals(14, wordCounter.getWordCount(new BufferedReader(new StringReader(TEST_CONTENT))));
    }
}

РЕДАКТИРОВАТЬ : Я должен отметить, что если ваши тесты используют тот же пакет, что и ваш код, вы можете уменьшить видимость

public int getWordCount(final BufferedReader reader)

метод, поэтому ваш публичный API предоставляет только

public int getWordCount(final File file)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...