У меня есть тест, вызывающий транзакционный метод в отдельном потоке, например:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:application-context.xml")
public class Test {
@Autowired
DatabaseBatchService databaseBatchService;
@Test
@Transactional
public void testConcurrentSaves() {
Entity e = Entity.createNew();
databaseBatchService.insert(e);
// Check database for inserted entities
}
}
@Component
class DatabaseBatchService implements Runnable {
@PostConstruct
public void init() {
Executors.newSingleThreadScheculedExecutor()
.scheduleAtFixedRate(this, 0, 100, TimeUnit.MILLISECONDS);
}
public synchronized void submit(Entity e) {
// cache entity
}
@Transactional
private synchronized void save() {
// insert cached entities
}
@Override
public void run() {
this.save();
}
}
Когда объект вставлен, с помощью ведения журнала я вижу, как он появляется в базе данных. Однако, когда я проверяю состояние базы данных в конце метода тестирования, база данных пуста.
Я понимаю, что это связано с откатом транзакции для потока.
Из теста, как я могу зафиксировать эти транзакции, чтобы вставленные данные были доступны для просмотра тестовым методом?