Протестируйте лямбду Kotlin в стандартной функции библиотеки «use» - PullRequest
0 голосов
/ 17 мая 2019

Я пытаюсь выполнить модульный тест кода в лямбда-функции, которая передается в встроенную функцию стандартной библиотеки Kotlin. Я попытался использовать thenAnswer с mockito, но не смог получить код для компиляции с isA () или любым () ArgumentMatchers из библиотеки Mockito-Kotlin . Вот фрагменты кода:

Тестируемый код

sessionFactory.openSession().use { session ->
    // Code I want to test
}

Код юнит-теста

val sessionFactory: SessionFactory = mock()
val session: Session = mock()
whenever(sessionFactory.openSession()).thenReturn(session)
whenever(session.use(isA())).thenAnswer{
    @Suppress("UNCHECKED_CAST")
    (it.arguments[0] as (Any) -> Any).invoke(session)
}

Я на правильном пути? Один из обходных путей - не использовать функцию use и явно закрывать объект сеанса Hibernate в блоке finally, но я бы не хотел этого делать.

Ответы [ 2 ]

1 голос
/ 17 мая 2019

Становится менее болезненно, если вы тестируете свой код напрямую, без openSession().use

Код продукции:

    sessionFactory.openSession().use { session ->
        codeIwantToTest(session)
    }
}

// visible for testing
fun codeIwantToTest(session: Session) {
    // your code goes here
}

Тестовый код:

private val session: Session = mock()

@Test
fun `some test`() {
    // some set up

    codeIwantToTest(session)

    // asserts and verify(session)
}

В случае, если вы сомневаетесь, что use делает свою работу, протестируйте его вот так (но это определенно своего рода паранойя)

@Test
fun `test library function use`() {
    session.use { session ->
        session.beginTransaction()
    }

    verify(session).beginTransaction()
    verify(session).close()
}
0 голосов
/ 20 мая 2019

Спасибо за ответ Фрэнк Неблунг.Оказалось, что я спешил отключить функцию «use» перед запуском тестируемого метода без него.Если вы достанете заглушку, функция «use» прекрасно работает с макетом.

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