類有一個類,看起來像這樣:我我怎麼能單元測試使用SimpleJdbcCall時
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作爲參數傳遞給一個新的構造函數,然後嘲笑它,但那會讓人覺得駭人聽聞。除非是要改善它,否則我更喜歡這個測試不會影響課程。
我想繼續使用這個SimpleJdbcCall API。它爲我編寫SQL,所以我不必混合使用SQL和Java,但我也很想測試這個東西,而不必編寫1000行代碼。任何人都可以看到一個很好的方法來測試它嗎
DI真的意味着配置的依賴,而不是一個不錯的選擇,以取代狀態的對象像'SimpleJdbcCall'。像這樣的依賴可以被嘲笑,所以代碼已經很容易測試。 –
「這樣的依賴可以被嘲弄得很好」如何? (正版問題) –
請注意,您可以在構造函數中保留'SimpleJdbcCall'的配置;只允許測試在外部創建實例,以便測試可以覆蓋'executeFunction()'。 –