Я предполагаю, что под «репозиторием» вы подразумеваете DAO; если нет, то этот ответ не будет применяться.
В последнее время я делал «в памяти» «макет» (или тестирование) реализаций моего DAO, которые в основном работают с данными (списком, картой и т. Д.), Переданными в конструктор mock. Таким образом, единичный тестовый класс может свободно использовать любые данные, необходимые для тестирования, изменять его и т. Д., Не заставляя все модульные тесты, работающие в DAO «в памяти», кодироваться для использования одних и тех же тестовых данных.
Один плюс, который я вижу в этом подходе, заключается в том, что если у меня будет дюжина модульных тестов, которые должны использовать один и тот же DAO для их теста (например, для ввода в тестируемый класс), мне не нужно помните все детали тестовых данных каждый раз (как если бы «макет» был жестко запрограммирован) - модульный тест сам создает тестовые данные. С другой стороны, это означает, что каждый юнит-тест должен потратить несколько строк на создание и подключение своих тестовых данных; но это маленький недостаток для меня.
Пример кода:
public interface UserDao {
User getUser(int userid);
User getUser(String login);
}
public class InMemoryUserDao implements UserDao {
private List users;
public InMemoryUserDao(List users) {
this.users = users;
}
public User getUser(int userid) {
for (Iterator it = users.iterator(); it.hasNext();) {
User user = (User) it.next();
if (userid == user.getId()) {
return user;
}
}
return null;
}
public User getUser(String login) {
for (Iterator it = users.iterator(); it.hasNext();) {
User user = (User) it.next();
if (login.equals(user.getLogin())) {
return user;
}
}
return null;
}
}
Я имею в виду шаблон хранилища. Я редактировал вопрос со ссылкой на определение Мартина Фаулера. – 2008-12-11 15:32:50