У меня есть класс, который выглядит так:
public class MyClass {
private final SimpleJdbcCall simpleJdbcCall;
public MyClass(final DataSource dataSource) {
this(new JdbcTemplate(dataSource));
}
public MyClass(final JdbcTemplate template) {
simpleJdbcCall = new SimpleJdbcCall(template)
.withoutProcedureColumnMetaDataAccess()
.withCatalogName("MY_ORACLE_PACKAGE")
.withFunctionName("GET_VALUE")
.withReturnValue()
.declareParameters(
new SqlOutParameter("RESULT", Types.VARCHAR))
.declareParameters(
new SqlParameter("P_VAR1_NAME", Types.VARCHAR))
.declareParameters(
new SqlParameter("P_VAR2_NAME", Types.VARCHAR))
.useInParameterNames("P_VAR1_NAME", "P_VAR2_NAME");
}
private String getValue(final String input) {
final SqlParameterSource params = new MapSqlParameterSource()
.addValue("P_VAR1_NAME", input, Types.VARCHAR)
.addValue("P_VAR2_NAME", null, Types.VARCHAR);
return simpleJdbcCall.executeFunction(String.class, params);
}
}
Он работает, как и ожидалось, но я хочу написать для него модульный тест, и это сводит меня с ума. Я пытался издеваться над JdbcTemplate (Mockito), но это приводит к фиктивным соединениям, метаданным и т. д., и я теряюсь во времени, когда в игру вступают вызываемые фабрики операторов.
Думаю, я мог бы написать так, чтобы SimpleJdbcCall передавался в качестве параметра новому конструктору, а затем издевался над этим, но это кажется хакерским. Я бы предпочел, чтобы тест не влиял на класс, если только он не улучшает его.
Я хотел бы продолжать использовать этот API SimpleJdbcCall. Он пишет SQL за меня, поэтому мне не нужно смешивать SQL и Java, но я также очень хотел бы протестировать эту штуку, не написав 1000 строк кода. Может ли кто-нибудь увидеть хороший способ проверить это?