我有一个看起来像这样的类:
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 作为参数传递给新的构造函数,然后对其进行模拟,但这感觉很老套。我希望测试不会影响类(class),除非它是为了改进类(class)。
我想继续使用这个 SimpleJdbcCall API。它为我编写 SQL,因此我不必混合使用 SQL 和 Java,但我也真的很想测试这个东西而不必编写 1000 行代码。谁能找到测试这个的好方法?
最佳答案
我也不想将 15 个不同的 SimpleJdbcCalls 注入(inject)我的存储库,所以我硬着头皮将其添加到我的测试设置方法中:
DatabaseMetaData metaData = mock(DatabaseMetaData.class);
Connection con = mock(Connection.class);
when(con.getMetaData()).thenReturn(metaData);
DataSource ds = mock(DataSource.class);
when(ds.getConnection()).thenReturn(con);
jdbcTemplate = mock(JdbcTemplate.class);
when(jdbcTemplate.getDataSource()).thenReturn(ds);
关于java - 如何对使用 SimpleJdbcCall 的类进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33225195/