Я использую Spring @Transactional
в классе обслуживания моего DAO. В приложении есть bean-компоненты, сконфигурированные в XML-формате и с помощью аннотаций типа @Service
.
Моя конфигурация тестового примера выглядит следующим образом:
@RunWith(SpringJunit4ClassRunner.class)
@ContextHierarchy({
@ContextConfiguration(locations = {"classpath:spring/spring.xml"}),
@ContextConfiguration(classes = {Service.class})
})
@ComponentScan(...)
public class TestRunner {
@Autowired
private Service service;
@Test
public void testSave() {
service.save(...);
}
}
Я настроил ниже в XML:
<tx:annotation-driven transaction-manager="txmManager"/>
<!-- bean for hibernate5 transaction manager using sessionfactory -->
Класс обслуживания выглядит следующим образом:
@Service
public class Service {
@Autowired
private DAO dao;
@Transactional
public Entity save(Entity entity) {
dao.save(entity);
}
}
Теперь все работает отлично во время запуска исходного контекста, но когда я запускаю тестовые случаи, транзакция никогда не вызывается. Примечание: Нет NPE при вызове метода Service.class
.
Я подправил и заметил, что если я создаю bean-компонент для Service.class
в моем (тестовом) весеннем XML-файле, тестовые сценарии работают, как и ожидалось, то есть вызывается диспетчер транзакций и база данных в памяти обновляется.
Я ожидал, что SpringJunit4ClassRunner
создаст MergedContext
, и конфигурация менеджера транзакций будет автоматически активирована при Service#save
вызове.
Есть мысли о том, что мне здесь не хватает?
Hibernate - 5.2.6. Финал,
Весна - 4.2.0. ВЫПУСК,
Spring-test - 4.1.6. РЕЛИЗ