Size: a a a

Kotlin Community

2020 July 09

RI

Ruslan Ibragimov in Kotlin Community
Да, launch задиспатчит работу на Default пул
источник

AH

Ayrat Hudaygulov in Kotlin Community
Спасибо!
источник

RI

Ruslan Ibragimov in Kotlin Community
Стоит почитать наверное доку по корутинам, почитать статьи на medium https://medium.com/@elizarov
источник

AH

Ayrat Hudaygulov in Kotlin Community
Ну в целом понятно как они работают, но в официальных доках очень скудно описано честно говоря
источник

КР

Кирилл Романенко... in Kotlin Community
Ayrat Hudaygulov
Ну в целом понятно как они работают, но в официальных доках очень скудно описано честно говоря
Ну можно создать тестовый проект и попробовать ручками.) Будет быстрее и даже проще, чем затирать доку до дыр.
источник

КР

Кирилл Романенко... in Kotlin Community
Alexandr Emelyanov
По листам должен
Неа. Для реализации листа используется ArrayList.
источник

RU

Roman Ushakov in Kotlin Community
Ayrat Hudaygulov
Ну в целом понятно как они работают, но в официальных доках очень скудно описано честно говоря
Попробуй поконтрибьютить доку) Вдруг в JB возьмут)
источник

AE

Alexandr Emelyanov in Kotlin Community
Кирилл Романенко
Неа. Для реализации листа используется ArrayList.
И?
источник

AN

Alexander Nozik in Kotlin Community
Ayrat Hudaygulov
ну в идеале понятно. А у меня на руках

override foo(completableFuture: CompletableFuture<…>): Unit =
Есть готовые конверторы для completableFuture
источник

A

Affected in Kotlin Community
всем привет,
подскажите пожалуйста, может кто в курсе, нагуглить не получилось:

Есть метод с сигнатурой:
suspend fun execute(key: K, valueSupplier: suspend () -> SomeObject): SomeObject

Задача - надо замокать этот метод таким образом, чтобы при вызове этой функции просто вызвался суплаер (второй аргумент) и вернул результат. 
Застрял на том - как скастить правильно этот самый аргумент к supplier'у:

whenever(cache.execute(any(), any())) 
        .thenAnswer{ (it.arguments[1] as () -> SomeObject).invoke() }


Ругается на то, что не может скастить к kotlin.jvm.functions.Function. Может кто то в курсе, как аргумент можно скастить к supplier лябмда функции корректно?
источник

AN

Alexander Nozik in Kotlin Community
Affected
всем привет,
подскажите пожалуйста, может кто в курсе, нагуглить не получилось:

Есть метод с сигнатурой:
suspend fun execute(key: K, valueSupplier: suspend () -> SomeObject): SomeObject

Задача - надо замокать этот метод таким образом, чтобы при вызове этой функции просто вызвался суплаер (второй аргумент) и вернул результат. 
Застрял на том - как скастить правильно этот самый аргумент к supplier'у:

whenever(cache.execute(any(), any())) 
        .thenAnswer{ (it.arguments[1] as () -> SomeObject).invoke() }


Ругается на то, что не может скастить к kotlin.jvm.functions.Function. Может кто то в курсе, как аргумент можно скастить к supplier лябмда функции корректно?
Скастить не получится, у суспенд функции есть неявный дополнительный аргумент, так что только завернуть.
источник

A

Affected in Kotlin Community
а по поводу завернуть - где можно посмотреть? в котлине не так давно, еще не сильно шарю
источник

AN

Alexander Nozik in Kotlin Community
Affected
а по поводу завернуть - где можно посмотреть? в котлине не так давно, еще не сильно шарю
Ну можно сделать Supplier{ runBlocking{valueSupplier()}}
источник

A

Affected in Kotlin Community
а, попробую, спасибо
источник

AN

Alexander Nozik in Kotlin Community
Смысл в том, что у вас есть асинхронный вызов, а вы из него хотите сделать синхронный. Для этого надо заблокировать что-то
источник

A

Affected in Kotlin Community
а сам мок вызывается в рамках runBlocking (и весь остальной тест) , т.е. как понимаю тут не проблема с третьим аргументом, который для суспенд поставляется
источник

A

Affected in Kotlin Community
хотя возможно суплаер надо отдельно тоже в runBlocking, попробую
источник

AN

Alexander Nozik in Kotlin Community
Affected
а сам мок вызывается в рамках runBlocking (и весь остальной тест) , т.е. как понимаю тут не проблема с третьим аргументом, который для суспенд поставляется
Я не очень понимаю, как работают ваши моки. Суть в том, что если у вас синхронная фунция с одним аргументом вызывается в не-суспенд мире, то ей откуда-то надо взять контекст или заблокироваться
источник

A

Affected in Kotlin Community
Получился такой вариант, выглядит страшно, но работает, может кому то пригодится:
@BeforeEach
fun init() = runBlocking {
   whenever(cache.execute(any(), any()))
           .thenAnswer {
               runBlocking {
                   (it.arguments[1] as (suspend () -> Any)).invoke()
               }
           }
   Unit
}
источник

А

Александр in Kotlin Community
Affected
Получился такой вариант, выглядит страшно, но работает, может кому то пригодится:
@BeforeEach
fun init() = runBlocking {
   whenever(cache.execute(any(), any()))
           .thenAnswer {
               runBlocking {
                   (it.arguments[1] as (suspend () -> Any)).invoke()
               }
           }
   Unit
}
возможно лучше использовать Mockk?
https://github.com/mockk/mockk
источник