开发者社区> 问答> 正文

零XML配置测试Spring&Hibernate应用 配置错误

我很热衷于在编译器和IDE的支持下通过移除XML文件来提升Spring3的开发效率,而这并不会改变Spring给你提供的强大的功能。

没有XML配置文件的Hibernate的单元测试是可行的,但是竟然花了我好一会才找到所有的东西,所以就在这里写下来。

我将在一个使用@Configuration注解的类中初始化所有的bean。

@Configuration @EnableTransactionManagement public class TestRepositoryConfig {
@Bean 
public DataSource dataSource() {
	return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2)
			.setName("Nuts").build();
}

@Bean 
public LocalSessionFactoryBean sessionFactoryBean() {
	LocalSessionFactoryBean result = new LocalSessionFactoryBean();
	result.setDataSource(dataSource());
	result.setPackagesToScan(new String[] { "pl.squirrel.testnoxml.entity" });

	Properties properties = new Properties();
	properties.setProperty("hibernate.hbm2ddl.auto", "create-drop");
	result.setHibernateProperties(properties);
	return result;
}

@Bean 
public SessionFactory sessionFactory() {
	return sessionFactoryBean().getObject();
}

@Bean 
public HibernateTransactionManager transactionManager() {
	HibernateTransactionManager man = new HibernateTransactionManager();
	man.setSessionFactory(sessionFactory());
	return man;
}

@Bean 
public OrderRepository orderRepo() {
	return new OrderRepository();
}

}

测试类是这样的:

@RunWith(SpringJUnit4ClassRunner.class) @TransactionConfiguration(defaultRollback = true) @ContextConfiguration(classes = { TestRepositoryConfig.class }) @Transactional public class OrderRepositoryTest {
@Autowired
private OrderRepository repo;

@Autowired
private SessionFactory sessionFactory;

@Test 
public void testPersistOrderWithItems() {
	Session s = sessionFactory.getCurrentSession();

	Product chestnut = new Product("Chestnut", "2.50");
	s.save(chestnut);
	Product hazelnut = new Product("Hazelnut", "5.59");
	s.save(hazelnut);

	Order order = new Order();
	order.addLine(chestnut, 20);
	order.addLine(hazelnut, 150);

	repo.saveOrder(order);
	s.flush();

	Order persistent = (Order) s.createCriteria(Order.class).uniqueResult();
	Assert.assertNotSame(0, persistent.getId());
	Assert.assertEquals(new OrderLine(chestnut, 20), persistent
			.getOrderLines().get(0));
	Assert.assertEquals(new OrderLine(hazelnut, 150), persistent
			.getOrderLines().get(1));
}

}

这里有几个需要注意的细节:

  • 我在测试上使用了@Transactional注解,然后我将可以直接访问Session。
  • 如果测试没有使用@Transactional注解,事务将总是忽略掉@TransactionConfiguration提交。
  • 如果测试使用了@Transactional注解,@TransactionConfiguration将被视为默认配置。即使他被忽略了,在test执行最后的时候事务也将回滚,如果你想让他提交,就是用@TransactionConfiguration(defaultRollback=false).
  • 对于不同的生产环境而言,测试的@Configuration可能都不同,我这里使用的是嵌入式的H2数据库,对于真实的应用我将在测试数据库上使用相同的引擎。
大家也都看到了,仅仅就两个java类,没有XML。你可以通过这里查看我在Github上托管的

展开
收起
huc_逆天 2020-05-28 09:19:01 473 0
0 条回答
写回答
取消 提交回答
问答排行榜
最热
最新

相关电子书

更多
云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第20讲):经典面试题与阿里等名企内部招聘求职面试技巧 立即下载
微服务架构模式与原理Spring Cloud开发实战 立即下载
阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和阿里云Docker仓库 立即下载