2016-11-19 134 views
0

我正在编写基于Hibernate/SQL的应用程序的crud API。我正在使用mysql进行测试和实况环境。Junit测试数据库

对于测试,我有一个数据库,用户和特权。因此,每次测试时,我必须按照下列步骤操作:

  1. 删除数据库中的所有表。
  2. 运行“mvn clean install”,hibernate在db中查找表并在不存在的情况下创建它们。

我想我的测试,它不会收集我的MySQL数据库中的垃圾,我不必每次都丢弃表。是否有一些可用于此目的的内存rdbms,以及如何根据运行环境选择this和mysql来进行测试或生活。

回答

3

我更喜欢使用H2,dbUnit和spring-test。 Hsqldb和Derby是其他内存数据库,是合理的选择。 Spring中的测试使用自己的独立上下文和自己的数据源,测试上下文配置取代了正常的应用上下文值。这样就不需要额外的努力来切换数据库,测试可以设置为在应用程序使用mysql时使用H2。

请注意,mysql允许接受的sql,其他数据库往往更严格。如果您使用原生SQL,可能会妨碍使用内存数据库。

我认为测试行使你的数据层是值得的,特别是在使用Hibernate的时候,这很复杂,我想确认它确实在做我认为应该做的事情。

+0

我也有些DAO测试,但通常他们是单元测试 - 只是测试数据库访问 - 我让这些层叠到“真实”数据库而不是内存之一。这样他们测试表元数据也是正确的,而不仅仅是访问它们的代码。但是通过测试访问DAO的其他图层中的代码,我通常会对它们进行存根或模拟,而不是让它们通过。 –

+1

@Jim:谢谢,我编辑过,所以我不会误解你的观点 –

1

HSQLDB和H2我认为这是很常见的选择。

就我个人而言,我不再走这条路 - 当我运行单元测试时,我只是用测试打包出DAO,以便他们写入或读取内存中的列表,或为它们提供模拟。没有复杂的技术。这确实意味着实际的数据库持久性没有被测试 - 如果我觉得我需要这样做,我通常会为DAO自己编写单独的单元测试,以专门连接到物理数据库,并在拆卸时清理我需要的任何东西那些测试。