Mat*_*one 5 java unit-testing mocking spring-jdbc mockito
我有一个看起来像这样的课程:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
它按预期工作,但我想为它编写单元测试,这让我发疯.我已经尝试过模拟JdbcTemplate(Mockito),但这会导致模拟连接,元数据等,并且我对可调用语句工厂发挥作用的时间感到迷茫.
我想我可以编写它,以便将SimpleJdbcCall作为参数传递给新的构造函数,然后模拟它,但这感觉很乱.我希望测试不会影响课程,除非是为了改进它.
我想继续使用这个SimpleJdbcCall API.它为我编写SQL,所以我不必混合SQL和Java,但我也非常想测试这个东西,而不必编写1000行代码.任何人都可以看到测试这个的好方法吗?
我肯定会采取添加构造函数的方法来允许SimpleJdbcCall直接注入。
MyClass(SimpleJdbcCall simpleJdbcCall) {\n this.simpleJdbcCall = simpleJdbcCall;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n(并且可能从当前调用的构造函数调用该构造函数new)。
这不是“hackish”,它只是依赖注入。我认为使类可测试而不需要测试其工作原理SimpleJdbcCall是一个明确的改进。
在构造函数中调用new会使测试变得更加困难,因为它是与正在实例化的类的紧密静态耦合。
我发现Mi\xc5\xa1ko Hevery 关于这个主题的博客文章非常有趣。
\n| 归档时间: |
|
| 查看次数: |
3270 次 |
| 最近记录: |