Я создал класс '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)