Я хочу проверить, что моя конечная точка контроллера возвращает соответствующий код ошибки при попытке удалить запись со ссылкой на дочерние записи. В моем интеграционном тесте мне нужно настроить состояние так, чтобы соответствующие записи существовали, затем вызвать конечную точку удаления, ожидать состояние ошибки и затем (в идеале) откатить всю БД до состояния, в котором она находилась до теста.
например
INSERT INTO parent_rec (id) VALUES ("foo");
INSERT INTO child_rec (id, parent_id) VALUES ("bar", "foo");
COMMIT;
DELETE FROM parent_rec WHERE id = "foo"; -- bang!
@PersistenceContext
EntityManager em;
@Transactional
void testDelete() {
// Set up records
ParentRecord record = new ParentRecord("foo");
em.persist(record);
em.persist(new ChildRecord("bar", record));
//delete
mockMvc.perform(delete("/parent/foo")).andExpect(/* some error code */);
}
Однако у меня возникают проблемы. Если я добавлю аннотацию @Transactional
на уровне метода или класса, записи не будут сохраняться до тех пор, пока не будет предпринята попытка удаления, поэтому удаление возвращает 200 OK, а не 400 Bad Request или подобное.
текущее решение заключается в том, чтобы тесты выполнялись по порядку (при предыдущем тесте настраиваются записи, над которыми пытается работать последующий тест). Однако это делает тесты довольно хрупкими и зависимыми друг от друга, чего я бы хотел избежать, прежде всего, чтобы упростить изменение кода.
Можно ли выполнить sh то, что я хочу, без использования дополнительного уровня набор инструментов? Раньше я использовал DBUnit, чтобы делать что-то подобное, но если бы я мог избежать добавления дополнительных зависимостей, я бы предпочел сохранить их простыми.