我正在为AbstractHibernateRepository保存方法编写单元测试。我正在使用弹簧测试运行器,但运行时出现以下异常:
org.hibernate.service.UnknownServiceException: Unknown service requested [org.hibernate.engine.jdbc.connections.spi.ConnectionProvider] at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:201)
我的测试:
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("file:src/main/webapp/WEB-INF/spring/spring-hibernate.xml") public class AbstractHibernateRepoTest extends AbstractHibernateRepo<Video> { @Autowired private SessionFactory sessionFactory; private Video video; public AbstractHibernateRepoTest() { super(Video.class); } @Before public void setUp () { video = new Video(); video.setId("xyz"); video.setName("Video Name"); video.setSrc("Source"); video.setThumbnail("Thumbnail"); Session session = sessionFactory.openSession(); session.beginTransaction(); session.save(video) ; session.close(); } @Test public void testSaveMethod () { video.setId("asa"); String id = (String) save(video); Assert.assertEquals(video.getId(), id); } @After public void breakDown () { sessionFactory.close(); } }
仓库:
@Autowired private SessionFactory sessionFactory; private final Class<T> clazz; public AbstractHibernateRepo(Class<T> clazz) { this.clazz = clazz; } @SuppressWarnings("unchecked") @Transactional(rollbackFor = HibernateException.class) @Override public T findById(Serializable id) { if (id == null) throw new NullPointerException(); return (T) getSessionFactory().getCurrentSession().get(getClazz(), id); } @Override @Transactional(rollbackFor = HibernateException.class) public Serializable save(T entity) { if (entity == null) throw new NullPointerException(); return getSessionFactory().getCurrentSession().save(entity); } @Override @Transactional(rollbackFor = HibernateException.class) public void delete(T entity) { if (entity == null) throw new NullPointerException(); getSessionFactory().getCurrentSession().delete(entity); } @Override @Transactional(rollbackFor = HibernateException.class) public void update(T entity) { if (entity == null) throw new NullPointerException(); getSessionFactory().getCurrentSession().update(entity); } }
弹簧配置:
<tx:annotation-driven transaction-manager="transactionManager"/> <!-- Root Context: defines shared resources visible to all other web components --> <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"> <property name="driverClassName" value="org.h2.Driver"/> <property name="url" value="jdbc:h2:mem:db1;DB_CLOSE_DELAY=-1;MVCC=TRUE"/> <property name="username" value="someuser"/> <property name="password" value="somepassword"/> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="packagesToScan" value="com.package.model"/> <property name="hibernateProperties"> <props> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> <prop key="hibernate.dialect">org.hibernate.dialect.H2Dialect</prop> </props> </property> </bean> <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"/> <property name="dataSource" ref="dataSource"/> </bean>
是什么导致此问题,如何解决?
我可能完全不在这里,但是对我来说,这似乎是会话处理异常。在@Before打开和关闭会话中,然后在save()当前会话中,这可能是您刚刚关闭的会话,从而导致异常。如果您不关闭它,请尝试一下它是否起作用@Before(我知道这不是解决方案,只是为了检验理论)。您也可以尝试在存储库中打开一个新会话,而不是获取当前会话(也不是解决方案)。与工作测试设置相比,我看到的唯一区别是,@Before我们还调用了标记为的存储库方法@Transactional,而不是直接创建会话。
@Before
save()
@Transactional