如何测试简单JDBCCALL



我需要为此代码创建测试。

@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;
}

您能告诉我如何用Mockito模拟getCall.execute(params)响应?

您的问题是,您在方法内创建整个getCall对象,这使得几乎不可能以某种方式将模拟注入该过程。

这里有一些可能性:

a)您可以模拟您的jdbcTemplate,然后尝试通过模拟getCall将对jdbcTemplate进行的所有调用来使其工作。由于jdbcTemplate可能会完成所有实际的DB工作,因此可以正常工作,但是说实话,这可能不值得(因为这绝对是不个性的)。

b)例如,您可以将整个测试切换为集成测试,例如,让其与内存中的DB相对。当然,有许多反对使用集成测试作为单位测试的替代的论点,因此这可能也不是最好的方法。不过,这是可能的,并且使用弹簧测试效果和注释,这很简单。

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

由于您的问题是您在内部创建简单的JDBCCALL,因此一种解决方案是将该部分(例如)提取到工厂中。这个简化的示例表明:

@Component
class SimpleJdbcCallFactory {
   public SimpleJdbcCall create(JdbcTemplate template) {
       return new SimpleJdbcCall(template);
   }
}

现在,您可以在课程中添加@Autowiend依赖关系,然后在单位测试中模拟该降低...

@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);
   }
}

要解决no datasource specified,我们需要模拟SimpleJdbcCall,以上代码调用原始方法。所以我们要超越错误。

请使用Power Mockito来模拟参数化的构造函数,如下所示

JdbcTemplate jdbcTemplateMock = Mockito.mock(JdbcTemplate.class);
SimpleJdbcCall mockedSimpleJdbcCall = Mockito.mock(SimpleJdbcCall.class);
PowerMockito.whenNew(SimpleJdbcCall.class).withArguments(jdbcTemplateMock).thenReturn(mockedSimpleJdbcCall);

相关内容

  • 没有找到相关文章

最新更新