У меня есть следующий модульный тест, в котором я хочу проверить, что оператор вызывается с правильными параметрами в правильном порядке.
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.10.19
- JDBC 7.0.0
- JDK 1.8.0_151