我应该使用mock或dbunit来测试访问数据库的方法吗?

时间:2013-02-14 13:45:13

标签: database unit-testing testing mocking dbunit

我有一个方法可以使用一些DAO对数据库进行一些调用。

我应该使用模拟机制来避免管理数据库(以及模拟所有DAO方法),还是应该使用dbunit(或某些等价物)通过在内存中加载和初始化数据库来测试(如hsqldb)?

这些方法的优缺点是什么(mock vs dbunit)?

3 个答案:

答案 0 :(得分:2)

您想要测试数据库。在这种情况下,我没有看到模拟是否有意义。一旦你知道DAO正在工作,那么将模拟注入到使用它们的服务中就足够了。

在此期间,请测试您的数据库。您可以创建临时测试数据库,也可以使所有测试都是事务性的:设置测试工作单元,执行它,验证它,然后回滚。

答案 1 :(得分:1)

我建议使用模拟对象,一般情况下,数据库访问并不是真正高效且花费很多时间,我们有一个项目有超过4000个单元测试,运行完整测试花了3个多小时,特别是考虑到在每次测试之前和之后设置和拆除访问数据库。

关于dbunit,我使用它,所以我无法确定它的好坏与否,但正如我所说的那样在单元测试中会避免数据库访问,它应该仅限于逻辑单元。

答案 2 :(得分:0)

这是一个难以回答的难题;但是,我建议和我通常更喜欢的是,针对嵌入式数据库或外部测试数据库(作为集成测试)测试DAO本身,以便您了解DAO对某种读取数据库的正确运行。

然后,对于使用DAO的组件,您可以模拟它以将测试与必须明确使用数据库分离。

这种方法的缺点是你必须有某种嵌入式或其他数据库可用于测试。

你可以模拟你的DAO单元测试;但是,你并不完全确定你的模拟将真正代表数据库将提供什么。

希望这有帮助。