Я работаю на крошечном framework завернуть базы данных вызовов хранимых процедур по имени spwrap
интерфейсы Mocking JDBC в Спока
@ConfineMetaClassChanges([CallableStatement])
def "Result of output parameter getInt throws SQLException"(){
given:
def sqlExceptionMsg = "exception happend while tring to call getInt"
CallableStatement.metaClass.getObject = { int parameterIndex -> throw new SQLException(sqlExceptionMsg)}
when:
def custId = customerDao.createCustomer("Abdullah", "Mohammad")
then:
def e = thrown(CallException)
e.cause == SQLException
e.cause.message == sqlExceptionMsg
}
метод createCustomer
не возвращает ссылку на CallableStatement
, однако под капотом CallableStatement.getObject(int)
, и я хочу проверить случай, когда бросается SQLException
.
Я пытаюсь переопределить bahvaiour на CallableStatement.getObject(int)
класса (так как я должен ссылаться на используемый объект в рамках - по крайней мере, в этом сценарии)
выше тест не пройден, как это кажется CallableStatement.getObject(int)
не является меняется. Однако, когда я использую <<
, он жалуется (и должен). Как это сделать?
UPDATE:
Использование GroovyMock
не помогает:
// test fails!
def "Calling interface methods calling JDBC Driver methods"(){
given:
CustomerDAO customerDAO2 = new DAO.Builder("jdbc:hsqldb:mem:customers", "sa", "").build().create(CustomerDAO);
def callableStatement = GroovyMock(JDBCCallableStatement, global: true)
when:
customerDAO2.createCustomer("Abdullah", "Mohammad")
then:
1 * callableStatement.getObject(_ as Integer)
}
Могу ли я добиться этого с другой оскорбляющей рамкой?
Поскольку я не совсем знаком с классными метаклассами, у меня возникает вопрос: влияет ли изменение метакласса интерфейса на все реализации этого интерфейса? Потому что, если это не так (и я этого ожидаю, учитывая ограничения на прокси-сервер Java), тогда код в этом вопросе ничего не делает для реализации jdbc-драйвера 'CallableStatement'. –
Есть ли у вас какая-то конкретная причина не использовать обычные макеты или заглушки, кроме как играть в мета-классы? – kriegaex
Нет, но я думаю, что mocks работает с конкретным экземпляром класса, но это не мой случай. –