Java模拟数据库连接

13

我想用数据库连接测试类。我要测试的类在构造函数中接受 Connection 类作为参数。我希望将模拟对象传递给构造函数。您能告诉我一个好的框架和示例,如何模拟数据库连接吗?


1
你可能会对这个资源感兴趣:http://programmers.stackexchange.com/questions/118933/what-elements-of-my-junits-should-i-mock - Piotr Nowicki
6个回答

14
你可以使用MockRunner,它支持JDBC。像Mockito这样的通用模拟框架也可以使用,但JDBC是一组返回彼此接口的接口,因此手动模拟将很困难。请自行查看:如何存根/模拟JDBC ResultSet以同时与Java 5和6一起工作? 然而,无论使用哪种工具,模拟JDBC都非常脆弱且冗长,我建议在一些薄的DAO层中抽象出JDBC访问(请参见@duffymo的答案),或者选择像H2这样的内存数据库。
另请参阅:

http://mockrunner.github.io/ 网站上说它正在托管更新版本 pvi :) - Enrique San Martín
“Mock JDBC driver not worth it”链接已失效。 - David Baucum

4

Connection是一个接口。任何模拟框架都可以对它进行模拟:EasyMockMockito等。

对它进行模拟与模拟其他Java接口没有区别。


4

您可以使用模拟框架,例如上面答案中提到的(我个人使用EasyMock)或者创建自己的模拟对象:

class FakeConnection extends Connection{
       // Overrive all method behavious you want to fake.
}

3

我认为创建模拟连接没有意义,它证明不了什么。

在你使用真实连接完全测试过存储库/DAO之后,我可以理解为什么会模拟存储库/DAO本身。因为你已经测试过它,所以可以将模拟存储库/DAO提供给服务或其他客户端,无需在进行集成测试之前证明它的工作正常。


这条注释是在2020年写的。很多大型组织都会有一个叫做Sonar扫描的东西,它会期望代码覆盖率(测试用例),如果你的项目中充满了JDBC调用,你别无选择,只能最终模拟这些JDBC调用。 - Stunner
我知道什么是声纳。我不同意。通过测试模拟对象并不能证明什么。一旦你已经证明了该类的工作原理,模拟对象就应该被传递给其他类。 - duffymo
同意。但是如果您需要满足Sonar和代码覆盖率,并且您的组织需要至少75%的代码覆盖率,除了模拟调用之外,我们还有什么选择?这纯粹是为了满足Sonar代码覆盖率要求。 - Stunner
大型组织往往会教条地做事,即使这些事情毫无意义。我理解您的要求,但我想指出这并不明智。请继续满足它,但您和其他人应该明白这是毫无价值的。您并没有提高质量或保证正确性。 - duffymo

1
我的Acolyte框架非常适合这种用途 -> https://github.com/cchantep/acolyte
使用此库,您可以创建一个连接实例,并提供处理程序。通过实现处理程序,您可以“分派”查询或更新:生成结果集或更新计数(或警告)。

1

如果您打算在许多测试用例中重复使用该模拟,则可以考虑实现自己的连接实现,并在各处重复使用该实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接