Фиксация / Флеширование транзакций во время юнит-теста?


Я использую Spring и JUnit для написания некоторых интеграционных тестов для моего DAO. Я настраиваю свои тестовые данные в начале метода тестирования, а затем тестирую свои методы DAO позже в том же методе тестирования. Проблема заключается в том, что если я не сброшу/зафиксирую транзакцию, EntityManager вернет тот же экземпляр сущностей, которые я только что создал в своей настройке данных, что делает мой тест бесполезным, поскольку они всегда будут проходить.

Например

@Test   
@Transactional()
public void loadTreeBasicCase() {
    // creates and saved node to DB
    Node n = createNode();

    // test DAO
    Node result = dao.lookup(n.getId());

    // verify
    assertThat(n, equalTo(result));
}

Один из способов-выставить commit() и / или flush() методы в моем Дао. Но я бы предпочел этого не делать, потому что в производственном коде это почти никогда не должно происходить (пусть EntityManager делает это). Есть ли способ настроить это с помощью аннотаций или в Spring config? Я использую Spring, JPA2 с Hibernate.

1 2

1 ответ:

Вы можете установить атрибут defaultRollback на @Transactional для сброса параметров между тестами. Это не похоже на то, о чем вы просите, просто сначала выбросьте это.

В рамках теста менеджер сущностей ведет себя правильно. Вы хотите ввести другое поведение для тестирования, чтобы "отключить" установку от остальной части теста. Одна вещь, которую я сделал в некоторых тестах, состояла в том, чтобы вызвать flush на entity manager непосредственно из теста. Мне пришлось сделать это всего несколько раз, но это было так. ценно в таких случаях. Я сделал это в тесте (не в DAO), чтобы не предоставлять метод на DAO, который я не хочу, чтобы люди звонили.