Тестирование методов JDBC, включая транзакционный аспект и закрытие соединения - PullRequest
0 голосов
/ 04 мая 2018

Я хотел бы определить тесты для методов JDBC в образовательных целях. В частности, в дополнение к проверке, имеют ли методы JDBC требуемую функциональность (я видел, что есть решения, такие как DBUnit и т. Д.), Я также хотел бы проверить, проверяют ли методы конкретные требования: - если они учитывают транзакционные проблемы при изменении (setAutocommit (false) / commit / rollback) - если они закрывают соединение, - и т. д.

Я не нашел ни одного решения для тестирования, которое проверяет, были ли вызваны специальные методы (методы, подобные предыдущим). Единственное, что приходит мне в голову, - это попытаться использовать решение для тестирования (например, DBUnit) вместе с AOP (например, AspectJ) для указания, запускаются ли такие методы.

Есть еще идеи? Спасибо!

1 Ответ

0 голосов
/ 04 мая 2018

Есть в основном три способа сделать то, что вы хотите достичь:

Дразнящий 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, за исключением того, что вам не нужно изменять тестируемое приложение, так что это наименее навязчивый и простой подход для простых задач проверки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...