在Groovy单元测试中重写JdbcTemplate方法

时间:2016-03-29 15:48:50

标签: grails groovy jdbctemplate

免责声明:我知道,集成测试正在进行中,我只需要测试jdbc查询后会发生什么;)

您好, 为grails服务类编写一些单元测试,我对包含对jdbcTemplate.query的调用的方法有一个小问题(string sql,Object [] params,RowMapper rm)

为了测试查询后发生的事情,我需要提供一个虚拟值。在之前的测试中,我能够使用:

覆盖queryForList
Service service = new Service()
def jdbcTemplate = [queryForList : {q, o -> return [1,2,3]}] as JdbcTemplate
service.setJdbcTemplate(jdbcTemplate);

没有任何问题。但是,对于查询方法,没有成功。随着

def jdbcTemplate = [query : {q, o, rm -> 'dummy'}] as JdbcTemplate
def jdbcTemplate = [query : {String q, Object[] o, RowMapper rm -> 'dummy'}] as JdbcTemplate
def jdbcTemplate = [query : {String q, Object o, RowMapper rm -> 'dummy'}] as JdbcTemplate

所有失败的

groovy.lang.MissingMethodException: No signature of method: 
JdbcTemplate_groovyProxy.query() is applicable for argument types: 
(java.lang.String, java.util.ArrayList, com.sun.proxy.$Proxy6) 
values: [select something from something where id = ? , [1], Service$_method_closure1@16aca316]
Possible solutions: query(java.lang.String, org.springframework.jdbc.core.ResultSetExtractor), 
query(java.lang.String, [Ljava.lang.Object;, org.springframework.jdbc.core.ResultSetExtractor), 
query(java.lang.String, org.springframework.jdbc.core.PreparedStatementSetter, 
org.springframework.jdbc.core.ResultSetExtractor), query(java.lang.String,
org.springframework.jdbc.core.ResultSetExtractor, [Ljava.lang.Object;), 
query(java.lang.String, org.springframework.jdbc.core.RowMapper), 
query(java.lang.String, [Ljava.lang.Object;, 
org.springframework.jdbc.core.RowMapper)

任何提示?或者我在这里做的事情真的很糟糕? (我是groovy的新手) 感谢。

2 个答案:

答案 0 :(得分:0)

即使这可以通过地图强制进行,但正如您尝试的那样,我建议您使用Spock Framework

您覆盖以编写测试的spec="camel case <txt>" 类包含SpecificationMock方法,因此您可以执行以下操作:

Stub

这甚至可以给你正确的错误信息,这样你就可以更容易地弄清楚什么是错误的。

答案 1 :(得分:0)

好的,所以我设法让它发挥作用(我忘记了,我在该项目上遇到了grails 1.3.7,如果我们有时间&#34,它将会是#34;稍后升级)

所以,使用mockFor:

def jdbcTemplate = mockFor(JdbcTemplate.class)
jdbcTemplate.demand.query() {q, o, rm -> ['dummy']}
service.setJdbcTemplate(jdbcTemplate.createMock());

这是有效的。正如您所注意到的,与我在问题中的示例不同,我将[&#39; dummy&#39;]作为列表返回,而不是&#39; dummy&#39;作为一个字符串。我认为这是错误,但不,不改变:/