Подтверждение из теста JUnit, что FileReader был закрыт должным образом

Я пишу код Java, который использует FileReader для загрузки данных из нескольких входных файлов. Я использую TDD довольно интенсивно, и я хотел бы добавить несколько тестов, которые гарантируют, что я правильно очищаюсь, вызывая close () для читателя, когда я закончу с ним. К сожалению, я не могу найти хороший способ проверить это. У кого-нибудь есть идеи?

Отредактировано, чтобы добавить: я знаю, что я могу явно проверить на закрытый вызов, используя фиктивные объекты, но я бы хотел избежать этого, если это возможно, частично потому, что я считаю, что они приводят к некоторому более скромному коду, и частично, потому что мне любопытно, возможно ли это написать код, который может распознавать эффекты не закрытия файла.)

11.12.2008 03:16:51
3 ОТВЕТА

Если вы можете передать объект FileReader в вызов, то вы можете предоставить пользовательский FileReader с переопределенным методом close - в этом случае у вас есть логическая переменная, которая проверяет, закрыто или нет. Затем вы можете использовать это для своего модульного теста.

1
11.12.2008 03:26:51

Я думаю, что способ сделать это - внедрить FileReader или Фабрику, которая создает FileReader, в ваш класс. Затем в своем модульном тесте вы можете внедрить фиктивную версию FileReader и проверить, был ли вызван соответствующий метод для него. Возможно, вы захотите взглянуть на JMock, чтобы создать фиктивный FileReader и настроить ожидание вызова метода close.

6
11.12.2008 03:28:33
Я действительно задаюсь вопросом, есть ли способ сделать это без насмешек, но я все еще одобряю это как вообще хороший совет.
Moss Collum 11.12.2008 03:50:55
Я бы сказал, что внедрение зависимостей имеет значение не только для включения mock, и в любом случае стоило бы сделать это, хотя я бы, вероятно, ввел интерфейс - InputStreamReader? DataReader? - вместо FileReader, чтобы уменьшить связь еще больше. Если у вас есть DI, насмешка является естественным шагом.
tvanfosson 11.12.2008 04:10:04

Один из способов, который должен работать, - это проверить метод ready () после закрытия FileReader, который должен выдать исключение. Например:

FileReader fr = new FileReader("somefile");
// ... file reader activity
fr.close();

// After closing the reader, the ready() method should cause an IOException:
boolean isOpen = true;
try {
  isOpen = fr.ready();
} catch (IOException e) {
  isOpen = false;
}
assertFalse("FileReader is still open", isOpen);
3
11.12.2008 03:43:05