ฉันมีชั้นเรียนที่มีลักษณะเช่นนี้:
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 แต่ฉันก็อยากทดสอบสิ่งนี้โดยไม่ต้องเขียนโค้ด 1,000 บรรทัด มีใครเห็นวิธีที่ดีในการทดสอบสิ่งนี้หรือไม่