#testing #mocking #jooq
#тестирование #издевательство #jooq
Вопрос:
У меня проблема с подделкой пустого результата с помощью jOOQ (версия 3.12.3
). Я использую MockDataProvider
, но он все равно возвращает одну строку. Вот код MockDataProvider
:
class DataProvider implements MockDataProvider {
@Override
public MockResult[] execute(MockExecuteContext ctx) {
return new MockResult[]{new MockResult(0, null)};
}
}
var dbContext = DSL.using(new MockConnection(new DataProvider()));
//....
Поэтому он должен возвращать 0 строк, и это то, что нужно. Однако на самом деле он возвращает 1 строку со 0
значением as.
12:51:34.799 [main] DEBUG org.jooq.tools.LoggerListener - Affected row(s) : 0
12:51:34.863 [main] DEBUG org.jooq.tools.LoggerListener - Fetched result : --------
12:51:34.863 [main] DEBUG org.jooq.tools.LoggerListener - : |metadata|
12:51:34.863 [main] DEBUG org.jooq.tools.LoggerListener - : --------
12:51:34.863 [main] DEBUG org.jooq.tools.LoggerListener - : |0 |
12:51:34.863 [main] DEBUG org.jooq.tools.LoggerListener - : --------
12:51:34.863 [main] DEBUG org.jooq.tools.LoggerListener - Fetched row(s) : 1
Любая помощь или совет очень ценятся.
Ответ №1:
Ваш MockResult
экземпляр кодирует количество обновлений 0
для использования с операторами DML, а не результирующий набор со 0
строками. Для этого вам нужно будет создать:
new MockResult(0, result)
Или в качестве альтернативы
Mock.of(result)
С
// some mock DSLContext configuration, as simple as DSL.using(SQLDialect.H2)
DSLContext ctx = ...
Result<Record> result = ctx.newResult(field1, field2);
Во многих случаях, даже если результирующий набор пуст, jOOQ необходимо будет знать имена столбцов и типы вашего результирующего набора. Они также присутствуют в любом обычном пустом наборе результатов SQL.