首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何测试SimpleJdbcCall

如何测试SimpleJdbcCall
EN

Stack Overflow用户
提问于 2017-11-22 08:20:31
回答 2查看 7.9K关注 0票数 2

我需要为这段代码创建测试。

代码语言:javascript
复制
@Autowired
JdbcTemplate jdbcTemplate;

public List<Row> getData(int id) {
    // Preconditions here

    SimpleJdbcCall getCall = new SimpleJdbcCall(jdbcTemplate)
            .withSchemaName(SCHEMA)
            .withProcedureName(SP)
            .declareParameters( 
                // ...
            )
            .returningResultSet("result", (RowMapper<QuestionAnswerRow>) (rs, rowNum) -> .....);

    MapSqlParameterSource params = new MapSqlParameterSource();
    params.addValue("id", id);
    // other parameters here

    Map queryRes = getCall.execute(params);
    List<row> res = (List<row>) queryRes.get("result");
    return res;
}

你能告诉我如何在这里模拟莫奇托的getCall.execute(params)响应吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-22 14:11:54

这里的问题是,您在方法中创建了整个getCall对象,这使得不可能以某种方式向该过程中注入一个模拟。

这里有几种可能性:

( a)您可以模拟您的jdbcTemplate,然后通过模拟getCall将对jdbcTemplate进行的所有调用来使其工作。由于jdbcTemplate可能会完成所有实际的db工作,这是可以工作的,但老实说,它可能不值得付出努力(因为它是绝对不平凡的)。

( b)您可以将整个测试切换到集成测试,例如,让它在内存中的数据库上运行。当然,有很多反对使用集成测试代替单元测试的论点,所以这可能也不是最好的方法。但是,使用Spring测试实用程序和注释是可能的,它可以非常简单。

( c)这给我们留下了一些工作,在这种情况下,这意味着重构:

因为您的问题是在内部创建SimpleJdbcCall,因此解决方案之一就是将该部分提取到工厂中。这个简化的例子表明:

代码语言:javascript
复制
@Component
class SimpleJdbcCallFactory {
   public SimpleJdbcCall create(JdbcTemplate template) {
       return new SimpleJdbcCall(template);
   }
}

现在,您可以在类中添加一个@Autowired依赖项,然后在单元测试中模拟这种依赖性.

代码语言:javascript
复制
@RunWith(MockitoJUnitRunner.class)
public class YourTestClassHere {

   @Mock
   private SimpleJdbcCallFactory simpleJdbcCallFactory;

   @InjectMocks
   private YourClassHere classToTest;

   @Test
   public void test() {
        SimpleJdbcCall mockedCall = Mockito.mock(SimpleJdbcCall.class);
        Mockito.when( simpleJdbcCallFactory.create(Mockito.any())).thenReturn(mockedCall);
        Mockito.when( mockedCall ).withSchemaName(Mockito.anyString()).thenReturn(mockedCall);
        // etc. unfortunately needed for fluent apis (unless they added those in mockito)
        Mockito.when( mockedCall.execute(Mockito.any()).thenReturn( ... );

        classToTest.getData(123);
   }

}
票数 6
EN

Stack Overflow用户

发布于 2019-05-07 18:40:58

为了解决no datasource specified,我们需要模拟SimpleJdbcCall,上面的代码调用原始方法。所以我们已经克服了错误。

请使用power模拟参数化构造函数,如下所示

代码语言:javascript
复制
JdbcTemplate jdbcTemplateMock = Mockito.mock(JdbcTemplate.class);
SimpleJdbcCall mockedSimpleJdbcCall = Mockito.mock(SimpleJdbcCall.class);

PowerMockito.whenNew(SimpleJdbcCall.class).withArguments(jdbcTemplateMock).thenReturn(mockedSimpleJdbcCall);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47429826

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档