Есть в основном три способа сделать то, что вы хотите достичь:
Дразнящий JDBC
Популярные варианты: mockito или jmock . Например, используя jmock, вы можете написать что-то вроде:
Mockery m = new Mockery();
Connection c = m.mock(Connection.class);
PreparedStatement s = m.mock(PreparedStatement.class);
m.checking(new Expectations() {{
oneOf(connection).prepareStatement("test"); will(returnValue(s));
oneOf(s).setFetchSize(10);
oneOf(s).execute();
oneOf(s).getUpdateCount();
oneOf(s).getWarnings();
oneOf(s).close();
}});
А потом:
// Example code under test:
try (PreparedStatement ps = c.prepareStatement("test")) {
ps.setFetchSize(10);
ps.execute();
ps.getUpdateCount();
ps.getWarnings();
}
// Finally, check if everything was called as expected.
m.assertIsSatisfied();
Реализация JDBC
API-интерфейсы для моделирования помогают легко реализовать макетную реализацию, но вы можете захотеть сделать гораздо больше, чем просто смоделировать драйвер. В этом случае вы можете реализовать JDBC:
class MyConnection implements Connection {
final Connection delegate;
public MyConnection(Connection delegate) {
this.delegate = delegate;
}
// ...
}
В этом случае вы можете теперь перехватывать любой вызов метода и начинать сбор статистики и делать утверждения внутри требуемых методов без изменения базового взаимодействия с базой данных, поскольку все вызовы JDBC будут делегированы фактическому драйверу .
Многие библиотеки, в том числе, например, jOOQ, поставляйте утилиты для создания таких прокси-объектов JDBC, см., например, jOOQ DefaultConnection
. В jOOQ также есть полная фиктивная реализация JDBC, которую можно увидеть в следующих статьях:
Но я не уверен, что это то, что вам нужно.
(Отказ от ответственности: я работаю в компании за jOOQ)
Использование AOP
Используя такой инструмент, как Javassist , вы можете перехватывать определенные вызовы методов, такие как вызовы требуемого метода JDBC, и запускать дополнительную логику до или после фактического вызова. Это работает так же, как и предыдущий подход к реализации JDBC, за исключением того, что вам не нужно изменять тестируемое приложение, так что это наименее навязчивый и простой подход для простых задач проверки.