Как издеваться над конструктором с помощью шпиона?

#kotlin #testing #mockk #kotlin-exposed

#kotlin #тестирование #mockk #kotlin-открытый

Вопрос:

В настоящее время я пытаюсь протестировать свой открытый код Kotlin. У меня есть таблица, следующая форме

 object Foo: Table() {
   *parameters*
}
  

и метод, который выглядит примерно так

 fun addNewFoo(){
    Foo.insert { ... }
}
  

Я тестирую addNewFoo и хочу проверить, произошла ли вставка, в идеале используя что-то вроде

 verify { FooSpy.insert { ... } } 
  

Как мне смоделировать таблицу Foo как шпионскую, чтобы я мог проверить, произошел ли вызов, или какой другой подход я должен предпринять, чтобы проверить, вызывается ли этот метод?

Ответ №1:

Вы можете сначала смоделировать свой одноэлементный Foo класс, используя mockkObject() , а затем проверить. Вот код:

 mockkObject(Foo) // mock the object
addNewFoo() // call function that we're testing
verify { Foo.insert(any()) } // verify
  

Комментарии:

1. Спасибо! Обычно это отлично работает, но, к сожалению, поскольку Foo это открытая таблица, у нее есть некоторые странные свойства, и это не работает. Он insert должен находиться внутри транзакции, что затрудняет тестирование

Ответ №2:

Обсуждаются способы решения этой проблемы: https://github.com/JetBrains/Exposed/issues/317

Похоже, что реального способа тестирования не существует, но создание небольших тестовых таблиц в базе тестовых данных — это самое близкое, что вы можете получить.