Как макетировать файл с EasyMock? - PullRequest
4 голосов
/ 22 апреля 2010

Недавно я познакомился с EasyMock, и меня попросили разработать некоторые модульные тесты для класса FileMonitor, использующего его. Класс FileMonitor основан на синхронизированном событии, которое просыпается и проверяет изменения файлов в определенном списке файлов и каталогов. Я понял, как это сделать, используя настоящую файловую систему, написал тест, который записывает в файл, и позволил FileMonitor делать свое дело. Итак, как мне это сделать с помощью EasyMock? Я просто не понимаю, как заставить EasyMock высмеивать файловую систему.

Спасибо, Тодд

Ответы [ 4 ]

6 голосов
/ 22 апреля 2010

Что-то вроде:

import static org.easymock.classextension.EasyMock.*;

File testDir = createMock(File.class);
expect(testDir.lastModified()).andReturn(10L);
// more expectations
replay(testDir);
// create a FileMonitor watching testDir
// run the method which gets invoked by the trigger     
verify(testDir);
2 голосов
/ 22 апреля 2010

Взгляните на превосходное (и краткое) руководство .Вы можете пересмотреть вопрос об использовании EasyMock - большинство людей в настоящее время используют или находятся в процессе перехода на более продвинутый и более активно разработанный Mockito (вдохновленный EasyMock).

0 голосов
/ 22 апреля 2010

Я бы поместил фактический вызов файловой системы в отдельный метод private-пакета. Для тестирования расширьте класс и переопределите этот метод. Таким образом, вы фактически не обращаетесь к файловой системе.

EasyMocks classextension также имеет возможность создавать темные насмешки, но я не совсем в этом убежден.

http://easymock.org/EasyMock2_4_ClassExtension_Documentation.html

0 голосов
/ 22 апреля 2010

Основной метод для насмешки состоит в том, чтобы ввести интерфейс (если в текущем проекте его нет), который предоставляет методы для реального сервиса (зависимости), который подвергается моделированию. Тест проверяет, что тестируемый класс правильно взаимодействует с зависимостью. Правильно здесь означает, что он делает то, что вы ожидаете. Это не означает, что он делает правильные вещи, поскольку правильные вещи могут быть определены только интеграционным тестом, в котором используются реальные компоненты (то, что вы планируете делать, создавая настоящий файл).

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

В тесте вы запускаете методы класса и утверждаете, что интерфейс был вызван так, как вы ожидаете.

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

Надеюсь, это поможет вам начать.

Некоторые фреймворки поддержки имитируют реальные конкретные классы, что может иметь большой смысл в модульных тестах после тестирования (перехватывая вызовы реальных классов, а не только интерфейсов). Я не мог найти, позволяет ли EasyMock вам это сделать, но JDave , вероятно, то место, куда вам нужно, если вам нужна такая функциональность. Это даже позволяет вам высмеивать последние классы.

...