Вопрос по file, mockito, junit, java, unit-testing – Как выполнить модульное тестирование метода, который читает данный файл

9

Я знаю, что это немного наивно. Как выполнить модульное тестирование этого куска кода без предоставления физического файла в качестве входных данных. Я новичок в мокито и модульном тестировании. Так что я не уверен. Пожалуйста помоги.

public static String fileToString(File file) throws IOException
{
    BufferedReader br = new BufferedReader(new FileReader(file));
    try {
        StringBuilder sb = new StringBuilder();
        String line = br.readLine();

        while (line != null) {
            sb.append(line);
            sb.append("\n");
            line = br.readLine();
        }
        return sb.toString();
    } finally {
        br.close();
    }
}
смотреть наstackoverflow.com/questions/17681708/... AbhinavRanjan
В приведенных примерах принят ответ, я думаю, что он берет физический файл для проверки кода. Я хочу проверить это без файла. user2990315

Ваш Ответ

4   ответа
0

edReader, чтобы сделать требуемый файл в вашем коде. Так что не было быНет необходимости создавать настоящий файл в вашей системе. Что бы произошло, если бы ты неУ меня недостаточно прав - на основании некоторых конкретных обстоятельств - для создания файла. Используя приведенный ниже код, вы создаете желаемое содержимое вашего файла:

public static void main(String a[]){

    String str = "converting to input stream"+
                    "\n and this is second line";
    byte[] content = str.getBytes();
    InputStream is = null;
    BufferedReader bfReader = null;
    try {
        is = new ByteArrayInputStream(content);
        bfReader = new BufferedReader(new InputStreamReader(is));
        String temp = null;
        while((temp = bfReader.readLine()) != null){
            System.out.println(temp);
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try{
            if(is != null) is.close();
        } catch (Exception ex){

        }
    }

}
16

JUnit обладает хорошей функциональностью для создания файлов, используемых для тестирования, и автоматической очистки их с помощьюTemporaryFolder править.

public class MyTestClass {

    @Rule
    public TemporaryFolder folder = new TemporaryFolder();

    @Test
    public void myTest() {
        // this folder gets cleaned up automatically by JUnit
        File file = folder.newFile("someTestFile.txt");

        // populate the file
        // run your test
    }
}
Нет, я бы так не сказал. Я нене думаю, что этопроблематично использовать реальные объекты, особенно когда это значительно облегчает тестирование. Для объекта, такого как File, который был тщательно протестирован и использован почти во всех приложениях Java (так что он, вероятно, работает довольно хорошо) И имеет все виды специфических для ОС вещей, связанных с ним, без вреда при использовании реального файла. Jeff Storey
Но развеТ, что против юнит-тестирований лучше не читать физический файл? user2990315
8

вероятно, должны изменить свой метод. Как вы поняли, метод, принимающий файл в качестве входных данных, не являетсяЭто легко проверить. Кроме того, это кажется статичным, что непомогает тестируемость. Если вы переписываете свой метод как:

public String fileToString(BufferedReader input) throws IOException

это будет намного легче проверить. отделяете свою бизнес-логику от технических особенностей чтения файла. Насколько я понимаю, ваша бизнес-логика читает поток и обеспечивает окончание строк в стиле Unix.

Если вы сделаете это, ваш метод будет тестируемым. также сделаете его более общим: теперь он может читать из файла, с URL или из любого вида потока. Лучший код, легче тестировать ...

Для достижения 100% покрытия кода необходимо также протестировать частные методы. user2990315
Я не'Я понимаю, что ваше предложение действительно использует bufferedreader. Могу ли я посмеяться над вводом bufferedreader или я могу легко добавить контент в буферизованный читатель, чтобы я мог проверить его вместо ввода файла? user2990315
Я думаю, что это должно быть статичным, потому что я звоню из конструктора. user2990315
Вы можете легко создать BufferedReader полностью в памяти с помощью StringReader, без зависимости от файла. Guillaume
3

java.io.File плохая идея, так как в ней много нативных вещей. Я бы посоветовал вам убедиться, что минималистский текстовый файл доступен в classpath при запуске модульных тестов. Вы можете преобразовать этот файл в текст и подтвердить вывод.

Нету. Я неЯ так не думаю. Весь смысл модульного тестирования состоит в том, чтобы написать свой код вединицы функциональности а затем протестировать каждый блок с небольшим выборочным вводом - и убедиться, что вы получаете правильный вывод для этого небольшого выборочного ввода. Amit Sharma
Спасибо. Но развеТ, что против юнит-тестирований лучше не читать физический файл? user2990315

Похожие вопросы