Saya memiliki kelas yang terlihat seperti ini:
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);
}
}
Ini berfungsi seperti yang diharapkan, tetapi saya ingin menulis unit test untuk itu dan itu membuat saya gila. Saya telah mencoba mengejek JdbcTemplate (Mockito), tetapi hal itu mengarah pada koneksi yang mengejek, metadata, dll, dan saya bingung tentang kapan pabrik pernyataan yang dapat dipanggil ikut berperan.
Saya kira saya bisa menulisnya sehingga SimpleJdbcCall diteruskan sebagai parameter ke konstruktor baru dan kemudian mengejeknya, tapi itu terasa hackish. Saya lebih suka tes ini tidak mempengaruhi kelas kecuali untuk memperbaikinya.
Saya ingin tetap menggunakan SimpleJdbcCall API ini. Itu menulis SQL untuk saya jadi saya tidak perlu mencampur SQL dan Java, tapi saya juga sangat ingin menguji hal ini tanpa harus menulis 1000 baris kode. Adakah yang bisa melihat cara yang bagus untuk menguji ini?