По вашему вопросу я предполагаю, что вы сами управляете своими сессиями. Я буду говорить о модульном тестировании. Интеграционные тесты могут быть выполнены в базе данных в памяти во время интеграции. Насколько я знаю, H2 или Derby - одни из самых популярных.
Вы можете пойти, передав ложную сессию своему DAO, но что произойдет, если один из ваших коллег напишет юнит-тест и забудет пройти пробную сессию? Вы попали в базу данных? Если вы НЕ хотите использовать базу данных, такой подход может стать проблемой
Что может быть лучше, если использовать абстрактный шаблон фабрики даже для получения Дао. В основном ваш код в настоящее время выглядит так:
MyDao.get(someId);
Однако вы можете пойти следующим образом:
Если вы сначала определите свой Дао так:
public interface IDao <SomeGenerics> {
public <T> T get(Class<T> type, ID key);
//more generic methods
}
Тогда у вас может быть реализация Дао, которая выглядит так:
public class MyDao <SomeGenerics> implements IDao<SomeGenerics> {
public <T> T get(Class<T> type, ID key){
//some real session stuff
}
//...more real session stuff
}
Затем в своих модульных тестах вы можете определить макет вашего интерфейса IDao, например:
public class MyDaoMock <SomeGenerics> implements IDao<SomeGenerics> {
//this thingy can hold a small array of mock instances
private ArrayList<T> mockInstances;
public <T> T get(Class<T> type, ID key){
//some fake stuff, kinda like this;
for (T mockInstance : mockInstances) {
if ( mockInstance.getId().equals(key) ) {//here i assume your T has a method getId, you figure out the kinks
return mockInstance;
}
}
//if not found, emulate your persistence's behavior, return null, throw an exception or do whatever
return null;
}
//...more fake stuff
}
Теперь у вас есть интерфейс и две реализации, одна для вашего рабочего кода и одна для ваших модульных тестов. Теперь все, что вам нужно сделать, это реализовать шаблон фабрики, чтобы дать вам правильный дао в производстве и в тестировании кода.