Recentemente me tornei um fã do Android Kotlin e me converti. Então li sobre corrotinas e pensei que todo o meu Natal geek havia chegado de uma vez.
As corrotinas em Kotlin permitem tarefas assíncronas fáceis. Com algumas linhas podemos fazer chamadas assíncronas e obter sua resposta
-- PRESENTER
fun getListOfThings() {
launch(Android) {
asyncTask { storageHelper.getListFromDb() }.await()
.let { list ->
view.useTheResult(list)
}
}
}
fun <T> asyncTask(function: () -> T): Deferred<T> {
return async(CommonPool) { function() }
}
Agora queremos testar a unidade do método getListOfThings . Primeiro, temos o problema de simulação em torno de classes e métodos Kotlin serem finais por padrão. Nada mal (abra-os ou use os recursos mais recentes do Mockito para simular o final).
Na minha implementação assíncrona anterior (RxJava), você pode facilmente trocar agendadores para teste, tornando assíncrono em síncrono para fins de teste. Isso se mostrou impossível usando corrotinas.
Em vez disso, tive que adotar uma abordagem diferente… primeiro vamos escrever um teste de unidade para getListOfThings :
-- TEST
@Test
fun getPackageFiltersForWidget() {
val list: ArrayList<PackageFilter> = ArrayList()
`when`(storageHelper.getListFromDb()).thenReturn(list)
presenter.getListOfThings()
Mockito.verify(view).useTheResult(ArgumentMatchers.eq(list))
}
-- PRESENTER
fun getListOfThings() {
launch(Android) {
asyncTask { storageHelper.getListFromDb() }.await()
.let { list ->
view.useTheResult(list)
}
}
}
fun <T> asyncTask(function: () -> T): Deferred<T> {
return async(CommonPool) { function() }
}
-- ACTIVITY
fun getList() {
presenter.getListOfThings()
}
O que precisamos fazer é mover a seção de inicialização (Android) para fora do apresentador, para que possamos testar apenas a lógica. Mas não queremos que o método apresentador seja chamado no UI Thread.
Insira a palavra-chave suspend e runBlocking :
-- TEST
@Test
fun getPackageFiltersForWidget() {
val list: ArrayList<PackageFilter> = ArrayList()
`when`(storageHelper.getListFromDb()).thenReturn(list)
runBlocking {
presenter.getListOfThings()
}
Mockito.verify(view).useTheResult(ArgumentMatchers.eq(list))
}
-- PRESENTER
suspend fun getListOfThings() {
asyncTask { storageHelper.getListFromDb() }.await()
.let { list ->
view.useTheResult(list)
}
}
fun <T> asyncTask(function: () -> T): Deferred<T> {
return async(CommonPool) { function() }
}
-- ACTIVITY
fun getList() {
launch(Android) {
presenter.getListOfThings()
}
}
Você obtém o mesmo erro dentro do teste, então envolva a chamada para o método getListOfThings com runBlocking .
Se fizermos o teste agora, tudo verde .. sim!
As corrotinas estão disponíveis apenas no Kotlin 1.1, que (no momento da escrita) está em RC.
Você precisará configurar seu projeto para usar 1.1 e, em seguida, adicionar a seguinte importação
compile "org.jetbrains.kotlinx:kotlinx-coroutines-core:0.11-rc"
Um guia passo a passo para migrar do Dagger para o Hilt em um projeto de vários módulos. Estrutura do Projeto Para visualizar o projeto, ele contém vários módulos NetworkModule, StorageModule, CommonModule, FeatureModule etc.
O Google atualizou recentemente seu aplicativo de teclado Gboard para Android para incluir um novo layout otimizado para tablets. Percebi esta manhã que estava tendo alguma dificuldade para digitar e, após uma inspeção mais detalhada, percebi que o teclado havia sido trocado.
Para evitar ambigüidade, os seguintes termos serão usados; Autenticador; O celular que está sendo utilizado para fazer o login no Site; O site ou aplicativo que o usuário está usando para fazer a solicitação de login do Serviço; O fornecedor que fornece o serviço fornecido, por exemplo
Em 2022, com o lançamento do GPT-3, a habilidade de escrita parece se tornar menos importante. Com a IA, pessoas com redação ruim também podem gerar funcionários de qualidade.
Olá, entusiastas cibernéticos! Bem-vindo de volta ao OSINT para a série de caça a ameaças. No primeiro artigo, apresentei uma visão geral do OSINT e sua importância na caça às ameaças.
“Ei, Siri, toque Me Dive, de Olivia Dean.” Era maio de 2021 quando comecei meu estágio na Future Academy Africa em Akure, Nigéria.