2

我应该如何对他们的意图是查询数据库并返回一些数据的方法进行单元测试?对于其他情况,我可以只模拟对象,但在这种情况下,我想测试它们是否返回正确的数据,我应该如何检查它与数据库的隔离?我应该使用某种特殊的数据库吗?但是,我应该如何配置该新数据库,使其与其他数据库一样使用所有这些列等?

谢谢。

更新:感谢大家,他们的回答使我走上了正确的道路。我终于用了debry。我刚刚为此添加了一个新的 persistence.xml。没有其他重大变化,它现在似乎正在工作。

4

3 回答 3

3

我成功使用的一种方法是使用:

  1. Maven来构建你的项目
  2. Liquibase(或 Flyway)来管理您的数据库模式,并对其进行版本控制
  3. H2作为与您的测试一起启动的内存数据库。

如果您没有使用上述任何一种方法,那么在那里可以学到很多东西,但根据我的经验,这是非常值得的。这对 Spring 应用程序非常有效;对于其他设置,您的里程可能会有所不同。

在进行任何测试之前,Maven 应该在内存中启动一个 H2 数据库实例。在 Spring 应用程序中,您只需使用 H2 JDBC URL 指定数据源,它就会自动启动。

您可以使用 Liquibase 运行一组 XML 脚本来设置数据库模式,然后使用单独的文件来填充测试数据(通过在运行 Liquibase 时指定不同的文件,或者使用context每个文件的属性changeSet)。这可以使用 Maven 来完成,或者在 Spring 中使用特定的 Liquibase bean 来完成。

从那里您可以像测试普通应用程序一样测试您的应用程序。不需要嘲笑,结果你会得到更多有用的测试。您可能需要更改架构或以其他方式解决 H2 与您的本机 RDBMS 之间的 SQL 差异。

顺便说一句,我非常赞成这类测试。根据我的经验,模拟一切并不能真正让您获得任何有趣的见解,并且应该是无法进行内部构建集成测试时的最后手段。不过有很多不同意我的!

于 2012-07-16T17:05:48.330 回答
1

您可以使用DBUnit。它采用您当前的模式,您可以轻松地模拟您的数据。

于 2012-07-16T17:18:20.443 回答
1

问题是你需要什么行为来进行单元测试?如果您模拟了数据库,那么您已经测试了所有重要的逻辑。您的数据库适配器将工作或不工作,您可以在针对真实数据库的集成/验收测试中进行验证。

于 2012-07-16T17:20:02.400 回答