Макет SQLServer CallableStatement - PullRequest
2 голосов
/ 07 апреля 2019

У меня есть следующий модульный тест, в котором я хочу проверить, что оператор вызывается с правильными параметрами в правильном порядке.

    StoredProcedure sp = new StoredProcedure("Schema.Procedure(?,?,?)");
    CloseableSQLServerDataTable table = new CloseableSQLServerDataTable(new SQLServerDataTableFactory().build());

    Connection conn = Mockito.mock(Connection.class);
    SQLServerCallableStatement stmt  = Mockito.mock(SQLServerCallableStatement.class);
    when(conn.prepareCall("{ call Schema.Procedure(?,?,?) }")).thenReturn(stmt);

    sp.executeWithTableParam(conn, table, 1, "Schema.CustomType", "foo", true);

    InOrder inOrder = Mockito.inOrder(stmt);
    inOrder.verify(stmt).setObject(1, "foo");
    inOrder.verify(stmt).setObject(2, table);
    inOrder.verify(stmt).setObject(3, true);
    inOrder.verify(stmt).execute();

Метод executeWithTableParam просто получает инструкцию и выполняет набор параметров в правильном порядке.

Вот фрагмент кода:

    try (CallableStatement stmt = conn.prepareCall(call))
    {
        setParametersWithTable(stmt, tableData, tableParamIndex, tableDataType, parameters);
        stmt.execute();
    }

И, наконец, setParametersWithTable метод

    for (int index = 0; index < length; index++)
    {
        if (index < tableParamIndex)
        {
            stmt.setObject(index + 1, parameters[index + 1]);
        }
        else if (index == tableParamIndex)
        {
            ((SQLServerCallableStatement) stmt).setStructured(tableParamIndex + 1 , tableDataType, tableData.getWrapped());
        }
        else
        {
            stmt.setObject(index + 1, parameters[index + 1]);
        }

    }
}

У меня вопрос: почему я получаю исключение NullPointerException в setMethod? Код в классе SQLServerStatement не должен выполняться, потому что это точка насмешки

java.lang.NullPointerException
at com.microsoft.sqlserver.jdbc.SQLServerStatement.checkClosed(SQLServerStatement.java:1046)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.setObject(SQLServerPreparedStatement.java:1487)
at com.xxx.yyy.StoredProcedure.setParametersWithTable(StoredProcedure.java:225)

Соответствующие версии:

  1. Мокито 1.10.19
  2. JDBC 7.0.0
  3. JDK 1.8.0_151
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...