Невозможно имитировать 0 строк, приводящих к jOOQ

#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.