[JAVA] Comment faire un test unitaire avec JVM sur une source à l'aide de RxAndroid

phénomène

Si vous le faites normalement, vous obtiendrez ExceptionInitializerError dans la partie ```AndroidSchedulers.mainThread () `` `.

Pourquoi est-ce une erreur

C'est parce que le planificateur retourné par ```AndroidSchedulers.mainThread () `` `dépend d'Android. (Si vous dépendez d'Android et ne faites rien, vous devez l'exécuter sur Android Test à l'aide d'un émulateur.) Ce lien vers la source correspondante Je vais.

Solution

Vous pouvez contourner ce problème en l'initialisant simplement en tant que planificateur séparé avec le mécanisme RxAndroidPlugins avant l'exécution du test.

Source spécifique

Voici la source de kotlin. Utilisez simplement le mécanisme Plugin pour définir une TestRule qui rend simplement le Scheduler utilisé indépendamment d'Android.

RxImmediateSchedulerRule.kt


class RxImmediateSchedulerRule : TestRule {

    private val immediate = object : Scheduler() {
        override fun scheduleDirect(run: Runnable, delay: Long, unit: TimeUnit): Disposable {
            return super.scheduleDirect(run, 0, unit)
        }

        override fun createWorker(): Worker {
            return ExecutorScheduler.ExecutorWorker { it.run() }
        }
    }

    override fun apply(base: Statement, description: Description): Statement {
        return object : Statement() {
            @Throws(Throwable::class)
            override fun evaluate() {
                RxJavaPlugins.setInitIoSchedulerHandler({ _ -> immediate })
                RxJavaPlugins.setInitComputationSchedulerHandler({ _ -> immediate })
                RxJavaPlugins.setInitNewThreadSchedulerHandler({ _ -> immediate })
                RxJavaPlugins.setInitSingleSchedulerHandler({ _ -> immediate })
                RxAndroidPlugins.setInitMainThreadSchedulerHandler({ _ -> immediate })

                try {
                    base.evaluate()
                } finally {
                    RxJavaPlugins.reset()
                    RxAndroidPlugins.reset()
                }
            }
        }
    }
}

Et faites-le juste avant de tester. Au fait, veuillez vous référer à cet article pour la raison pour laquelle vous n'utilisez pas `` @ ClassRule ''.

@RunWith(PowerMockRunner::class)
@PrepareForTest(Auth::class)
class LoginViewModelTest {

    @Rule
    val schedulers: RxImmediateSchedulerRule = RxImmediateSchedulerRule()

//    companion object {
//        @JvmField
//        @ClassRule
//        val schedulers: RxImmediateSchedulerRule = RxImmediateSchedulerRule()
//    }
    @Test
    fun onClickLogin() {

        val mockAuth = PowerMockito.mock(Auth::class.java)

        val target = LoginViewModel(mockAuth)

        target.mail.set("email")
        target.password.set("password")

        val result = Single.just(AuthEntity().apply {
            accessToken = "123456"
            userId = 100
        })
        PowerMockito.`when`(mockAuth.login("email", "password")).thenReturn(result)

        target.onClickLogin().run()

        Mockito.verify(mockAuth).login("email", "password")
    }
}

Recommended Posts

Comment faire un test unitaire avec JVM sur une source à l'aide de RxAndroid
Comment écrire dynamiquement des cas de test itératifs à l'aide de test / unit (Test :: Unit)
Comment faire un test unitaire de Spring AOP
Comment tester l'étendue privée avec JUnit
[Java] Comment tester s'il est nul dans JUnit
Comment tester les interruptions pendant Thread.sleep avec JUnit
Comment écrire du code de test avec la certification de base
Faites un test unitaire avec Junit.
Comment écrire un test unitaire pour Spring Boot 2
Introduction à Micronaut 2 ~ Test unitaire ~
Test unitaire d'architecture avec ArchUnit
Comment numéroter (nombre) avec html.erb
Comment mettre à jour avec activerecord-import
Comment autoriser à l'aide de graphql-ruby
Comment tester avec des images lors de l'utilisation d'ActiveStorage et de Faker
Comment définir des variables d'environnement lors de l'utilisation de Payjp avec Rails
Comment inverser la compilation du fichier apk en code source Java avec MAC
Comment exécuter uniquement des fichiers spécifiques avec le test de rake de gem
Comment créer une application à l'aide de Tensorflow avec Android Studio
Comment effacer l'image de test après avoir exécuté le test Rspec à l'aide de CarrierWave
Comment démarrer avec JDBC en utilisant PostgresSQL sur MacOS
Comment s'inscrire en tant que client dans Square à l'aide de Tomcat
Comment démarrer avec Slim
Comment entourer n'importe quel caractère avec "~"
Comment utiliser mssql-tools avec Alpine
Exemple de code pour le test unitaire d'un contrôleur Spring Boot avec MockMvc
J'ai testé comment utiliser le test / l'unité de Ruby et le code de Janken.
[RSpec] Test unitaire (avec gem: factory_bot)
[rails] Faisons un test unitaire avec Rspec!
Comment créer CloudStack à l'aide de Docker
Comment démarrer Camunda avec Docker
Comment déployer sur AWS à l'aide de NUXTJS S3 et CloudFront officiels? Avec docker-compose
Comment réaliser une recherche hybride en utilisant l'analyse morphologique et Ngram avec Solr
Comment tester une méthode privée qui prend un tableau ou un argument de longueur variable dans JUnit
Comment définir différentes versions source / cible pour le code de production et le code de test
Comment exécuter un contrat avec web3j
Comment trier une liste à l'aide du comparateur
Comment ajuster TextPosition avec l'extension de clavier iOS
Comment partager des fichiers avec Docker Toolbox
Comment compiler Java avec VsCode & Ant
[Rails] Comment télécharger des images à l'aide de Carrierwave
[Java] Résumez comment comparer avec la méthode equals
Comment filtrer JUnit Test dans Gradle
[Android] Comment gérer les thèmes sombres
Comment utiliser BootStrap avec Play Framework
Bibliothèque de tests unitaires Java Artery-Easy to use
Comment changer d'images miniatures avec JavaScript
[Java] Comment calculer l'âge à l'aide de LocalDate
[Note] Comment démarrer avec Rspec
Je veux écrire un test unitaire!
Comment faire un contrôle basé sur l'API avec cancancan
Comment réaliser le téléchargement de fichiers avec Feign
Comment mettre à jour les modèles associés avec accepte_nested_attributes_for
Comment définir JAVA_HOME avec l'appassembler-maven-plugin de Maven
Comment implémenter TextInputLayout avec la fonction de validation