免责声明:我知道,集成测试正在进行中,我只需要测试jdbc查询后会发生什么;)
您好, 为grails服务类编写一些单元测试,我对包含对jdbcTemplate.query的调用的方法有一个小问题(string sql,Object [] params,RowMapper rm)
为了测试查询后发生的事情,我需要提供一个虚拟值。在之前的测试中,我能够使用:
覆盖queryForListService 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的新手) 感谢。
答案 0 :(得分:0)
即使这可以通过地图强制进行,但正如您尝试的那样,我建议您使用Spock Framework。
您覆盖以编写测试的spec="camel case <txt>"
类包含Specification
和Mock
方法,因此您可以执行以下操作:
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;作为一个字符串。我认为这是错误,但不,不改变:/