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

标签 java unit-testing mocking mockito spring-jdbc

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

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/

相关文章:

java - 使用 AppCompat 以编程方式更改操作栏背景和文本颜色

java - 在大学完成计算机科学专业的第一年…夏天该做什么?

c# - 关于 C# 的 TDD 和 Mocks 处理的书籍

.net - 使用 Moq 使用 Expression<Func<T,bool>> 参数的模拟方法

unit-testing - ASP.NET Core 1.0 模拟

java - 尽管使用了着色 jar,但 cassandra 的 Java 驱动程序 3.0 中仍出现 IllegalStateException

java - 浏览文件夹以加载类

unit-testing - 使用 Fitness 与自动化集成测试相比有什么优势?

ios - 如何对 NSFetchedResultsControllerDelegate 进行单元测试?

java - Maven 中的单元测试需要访问 src/main/webapp 目录