Как проверить IO-код в JUnit? - PullRequest
3 голосов
/ 21 июня 2011

Я хочу проверить две службы:

  1. служба, которая создает имя файла
  2. служба, которая записывает некоторые данные в файл, предоставленный 1-й службой

Во-первых, я строю некоторую сложную файловую структуру (например, {user}/{date}/{time}/{generatedId}.bin)

Во-вторых, я записываю данные в файл, переданный первой службой (1-я служба вызывает 2-ю службу)

Как я могу протестировать обе службы с помощью имитаций без каких-либо реальных операций ввода-вывода?

Например:

1-я служба:

public class DefaultLogService implements LogService
{

    public void log(SomeComplexData data)
    {
        serializer.write(new FileOutputStream(buildComplexFileStructure()), data);
        or
        serializer.write(buildComplexFileStructure(), data);
        or
        serializer.write(new GenericInputEntity(buildComplexFileStructure()), data);
    }

    private ComplextDataSerializer serializer; // mocked in tests
}

2-я служба:

public class DefaultComplexDataSerializer implements ComplexDataSerializer
{

    void write(InputStream stream, SomeComplexData data) {...}
    or
    void write(File file, SomeCompexData data) {...}
    or
    void write(GenericInputEntity entity, SomeComplexData data) {...}

}

В первом случае мне нужно передать FileOutputStream, который создаст файл (т.е. я не могу протестировать 1-ю службу)

Во втором случае мне нужно передать File.Что я могу сделать во втором сервисном тесте, если мне нужно проверить данные, которые будут записаны в указанный файл?(я не могу проверить 2-й сервис)

В третьем случае я думаю, что мне нужен какой-то универсальный объект ввода-вывода, который обернет File.Может быть, есть какое-то готовое решение для этой цели?

1 Ответ

5 голосов
/ 22 июня 2011

В первом случае, зачем вам сам файл, если вы тестируете генерацию имени файла?Вы не хотите тестировать FileOutputStream.

Я предполагаю, что ваш метод выглядит примерно так:

public File buildComplexFileStructure() {
    // code
}

Ваш тест будет выглядеть примерно так:

@Test public void test() throws Exception {
    File expected = <what you expect to be generated>;
    File actual = new DefaultLogService().buildComplexFileStructure();
    assertEquals(expected, actual);
}

Если этот метод не доступен публично, просто выставьте его на тест (по умолчанию или защищенный).

Во втором случае вы не могли бы передать ByteArrayOutputStream из вашего тестового теста в ваш метод,тогда проверь что было написано?т.е.:

@Test public void test() throws Exception {
    btye[] expected = <expected data>;
    ByteArrayOutputStream actualStream = new ByteArrayOutputStream();
    new DefaultComplexDataSerializer().write(actualStream, data);
    byte[] actualData = actualStream.toByteArray();
    // compare expected and actualData
}
...