транзакции и тестирование
От: зиг Украина  
Дата: 26.01.15 12:18
Оценка:
Опишу свою проблему максимально понятно.
Итак, есть у меня кусок кода A для которого я хочу понаписать юнит тесты (или, интеграционные, не так важно).

class A {
..
@Transactional(propagation=REQUIRES_NEW)
public void oneOfTheMethods() {

...
}
..
}


Написала тест:

@Transactional
public void testAlotOfSutff(){
 doSomePreparation();
 insertSomeRequiredData();
 callProcessB();
 ..
 //at the end, finally we can test processA
 callProcessA();

}


Теперь в чем суть проблемы:
мой тест вставляет всякие данные в тестовую базу, вызывает разные подпроцессы, и предполагается что после выполнения тесты все роллбечится, то есть мы не замусориваем тестовую базу ничем плохим, тестируем обе части кода — как которая что-то вставляет, и ту которая работает с этими данными, в общем много плюсов.
Все работало прекрасно. пока мне не понадобилось потестировать в конце как работает метод A.oneOfTheMethods на этих данных — оказалось, что он нифига не работает.
Т.к. он суспендит юниттестовскую транзакцию и создает новую транзакцию (из-за REQUIRED_NEW propagation!)
и соответственно "не видит" данных которые юниттест вставил до этого. СУБД Оракл — поэтому выставить isolation=READ_UNCOMMITTED не удается.
Что делать?

менять propagation только из-за юниттеста я не могу — вопервых он не зря там стоит этот пропагейшн, во=вторых мы не должны менять код который тестируем только потому что не можем нормально написать тест.
Что делать-то?

я согласна даже на чтонибудь типа рефлексией изменять уровень пропагации этого метода ТОЛЬКО для тестирования. но чтоб в продакшне был код без изменений. такое возможно?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.