gpt4 book ai didi

java - 如何对使用 SimpleJdbcCall 的类进行单元测试

转载 作者:搜寻专家 更新时间:2023-10-31 20:33:14 25 4
gpt4 key购买 nike

我有一个看起来像这样的类:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com