Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java jOOQ:模仿DAO对象_Java_Sql_Unit Testing_Mocking_Jooq - Fatal编程技术网

Java jOOQ:模仿DAO对象

Java jOOQ:模仿DAO对象,java,sql,unit-testing,mocking,jooq,Java,Sql,Unit Testing,Mocking,Jooq,jOOQ 3.5.0 我目前正在尝试为使用jOOQs生成的DAO对象的资源编写单元测试 我注意到DAO层次结构中的一个基类(DAOImpl)有许多final方法,这使得模拟变得不友好(我排除了像Powermock这样的字节码操纵器作为解决方案)。我目前正在使用MockConnection和MockDataProvider模式来填充我的DAO,但对于断言DAO方法调用来说,这似乎有点低 例如,我的资源正在调用FooDao.createFoo(foo),我在测试中的拦截点是MockDataProvi

jOOQ 3.5.0

我目前正在尝试为使用jOOQs生成的DAO对象的资源编写单元测试

我注意到DAO层次结构中的一个基类(
DAOImpl
)有许多
final
方法,这使得模拟变得不友好(我排除了像Powermock这样的字节码操纵器作为解决方案)。我目前正在使用
MockConnection
MockDataProvider
模式来填充我的DAO,但对于断言DAO方法调用来说,这似乎有点低

例如,我的资源正在调用
FooDao.createFoo(foo)
,我在测试中的拦截点是
MockDataProvider.execute(…)
,它为我提供了一个带有原始SQL的上下文对象和一个值绑定对象数组

为了让测试断言
create
已被调用,我需要评估原始sql。当DAO有好的、流畅的方法可以断言时,这样做似乎是浪费

所以我的问题是:有没有更好的方法来单元测试DAO的使用情况?似乎我需要很多锅炉板来测试一个简单的合同

FooDao fooDao = createMock(FooDao.class);
....
when(fooDao.fetchById(id)).thenReturn(foo);

比。

更可取。现在,如果不使用PowerMock之类的工具,将很难模拟jOOQ DAO,因为它会为您从字节码中删除
final
,以便覆盖这些方法

然而,在即将发布的JOOQ3.6中,我们计划为DAOs实现接口代码生成。这些更容易被嘲笑

另见:

是什么阻止您使用Powermock?或者,您可以使用而不是
DAOImpl
并编程(即模拟)接口吗?@Xaerxess在
FooDao
DAO
之间有太多的细节。这意味着我需要为每个DAO准备大量的锅炉板,以便能够编写一个干净的测试。@LukasEder PowerMock是临时解决方案,但我想换成更干净的。这类工具会在构建/测试套件(使用回收的JVM等)中产生问题。API通过最终方法被锁定是一种很好的设计,但是如果生成的接口没有这些方法,将大大有助于轻量级单元测试。@markdsievers:这不会导致一个客观的答案:)但是“更干净的东西”和“模拟”是两个根本相反的概念。当您想要模拟事物时,总是会遇到Java语言或JVM的限制,因此您不妨求助于字节码操作和插装。仅仅是模仿的想法从根本上与封装和其他核心OO/Java设计工具相反,即使TDD鼓吹者喜欢假装情况并非如此(在Java的上下文中)。例如,jOOQ的大部分内容都是故意包私有的,甚至是静态的。。。