jOOQ - это инструмент, который помимо абстракции SQL также имеет встроенные небольшие инструменты, такие как SPI, который позволяет имитировать весь JDBC. Это может работать двумя способами, как описано в этом сообщении в блоге :
Реализуя MockDataProvider
SPI:
// context contains the SQL string and bind variables, etc.
MockDataProvider provider = context -> {
// This defines the update counts, result sets, etc.
// depending on the context above.
return new MockResult[] { ... }
};
В приведенной выше реализации вы можете программно перехватывать каждый оператор SQL и возвращать для него результат, даже динамически, "разбирая" строку SQL, чтобы извлечь некоторые предикаты / информацию таблицы и т. Д.
Используя более простой (но менее мощный) MockFileDatabase
... в следующем формате (набор пар оператор / результат):
select first_name, last_name from actor;
> first_name last_name
> ---------- ---------
> GINA DEGENERES
> WALTER TORN
> MARY KEITEL
@ rows: 3
Приведенный выше файл можно затем прочитать и использовать следующим образом:
import static java.lang.System.out;
import java.sql.*;
import org.jooq.tools.jdbc.*;
public class Mocking {
public static void main(String[] args) throws Exception {
MockDataProvider db = new MockFileDatabase(
Mocking.class.getResourceAsStream("/mocking.txt");
try (Connection c = new MockConnection(db));
Statement s = c.createStatement()) {
out.println("Actors:");
out.println("-------");
try (ResultSet rs = s.executeQuery(
"select first_name, last_name from actor")) {
while (rs.next())
out.println(rs.getString(1)
+ " " + rs.getString(2));
}
}
}
}
Обратите внимание, как мы используем API JDBC напрямую, без фактического подключения к какой-либо базе данных.
Обратите внимание, я работаю на поставщика jOOQ, поэтому этот ответ предвзят.
Осторожно, в какой-то момент вы реализуете целую базу данных
Вышесказанное работает для простых случаев. Но будьте осторожны, что, в конце концов, вы будете реализовывать всю базу данных. Вы хотите:
- Проверка синтаксиса SQL.
ОК, смоделировав базу данных, как показано выше, вы можете «проверить» синтаксис, потому что любой синтаксис, который вы не предусмотрели в точной версии, как указано выше, будет отвергнут при любом таком подходе. .
Вы могли бы реализовать синтаксический анализатор, который анализирует SQL ( или, опять же, использовать jOOQ ), а затем преобразовать инструкцию SQL в нечто, что вы могли бы легче распознать и получить результат. Но, в конечном счете, это просто означает реализацию всей базы данных.
- Что еще более важно, убедитесь, что данные выбраны / обновлены / вставлены правильно, в соответствии с данной ситуацией.
Это делает вещи еще сложнее. Если вы запускаете вставку, а затем обновляете, результат, очевидно, отличается от обновления сначала, а затем вставки, поскольку обновление может влиять или не влиять на вставленную строку.
Как убедиться, что это происходит при "издевательстве" над базой данных? Вам нужен конечный автомат, который запоминает состояние каждой «ложной» таблицы. Другими словами, вы создадите базу данных.
Насмешка приведет вас так далеко
Как уже упоминалось piotrek , насмешка приведет вас только так далеко. Это полезно в простых случаях, когда вам нужно перехватить только несколько очень известных запросов. Это невозможно, если вы хотите смоделировать базу данных для всей системы. В этом случае используйте реальную базу данных, в идеале тот же продукт, который вы используете в производстве.