При запуске Fitnesse SliM для тестирования транзакционного метода в приложении Spring возникает исключение SQLException - источник данных закрыт.
Вот что происходит:
В моем приложении метод importFile (String filename) считывает CSV-файл и обновляет данные до нескольких таблиц в базе данных. Это транзакционный метод весеннего применения. Таким образом, если при обновлении одной строки файла возникает исключение, все обновления отката этой строки и всех других строк (включая предыдущие строки и следующие строки) продолжают обновляться.
См. Ссылку по ссылке: Как определить транзакции отката, которые вызываются внутри цикла с помощью Spring AOP?
Шаг тестирования на странице запросов SliM FitNesse таблицы
1 Страница SetUp устанавливает данные тестирования с помощью файла установки
|Query: Test Case | test_file_setup.csv |
| name | phone | email |
| tom | 123 | tom@test.com |
| dick | 456 | dick@test.com |
| harry | 789 |harry@test.com |
результат: тестирование пройдено
2 Тестовая страница проверяет тестовый файл с недопустимой строкой, поэтому при выполнении этой строки выполняется только откат этой строки, но все остальные строки продолжаются, однако ... проверка завершилась неудачно, откат всех строк и закрытие источника данных ,
3 Итак, когда tearDown, который пытается протестировать допустимый файл и очистить базу данных, тоже не удался ... таким образом, источник данных был закрыт
Это один тест SliM, но на каждой странице SetUp, Test и tearDown есть таблица запросов. Я предполагаю, что один фитнес-тест инициирует только один экземпляр контекста Spring. Скажи мне, если я ошибаюсь. Однако этот метод объявлен как транзакция в весеннем конфиге. Откат происходит, как и ожидалось, а тест - нет.
Вот мой тестовый класс
public class TestCase{
private ImportFile importFile;
private String filename;
public TestCase(String filename){
this.filename = filename;
init();
}
public void init(){
//initialize the spring context
//and get beans...
importFile = (ImportFile) context.getBeans("importFile");
start();
}
public void start(){
//read rows from file...
for( ... loop per row...){
//this is a transactional method...
//it reads the file and update every row to the database
//it is supposed to row back one row (per loop)
//and continue if an exception thrown
//but it rollback the all rows and close the datasource
importFile.importFile(filename);
}
}
public List<Object> query(){
//read from database and return the test result to the Slim query table
...
cleanup();
}
public void cleanup(){
//close the spring context
...
}
}
Похоже, что на тестовой странице Fitnesse запускает новый процесс тестирования (создает новый экземпляр TestClass) для SetUp, Test, TearDown. Тем не менее, результат доказывает, что я ошибаюсь?!