[JAVA] So führen Sie mit RxAndroid einen Komponententest mit JVM an einer Quelle durch

Phänomen

Wenn Sie es normal machen, erhalten Sie "ExceptionInInitializerError" im Teil von "AndroidSchedulers.mainThread ()".

Warum ist es ein Fehler?

Dies liegt daran, dass der von `AndroidSchedulers.mainThread ()` zurückgegebene Scheduler von Android abhängt. (Wenn Sie von Android abhängig sind, müssen Sie es in Android Test mit einem Emulator ausführen.) Dies Link zur relevanten Quelle Ich werde.

Lösungen

Sie können dieses Problem umgehen, indem Sie es einfach als separaten Scheduler mit dem RxAndroidPlugins-Mechanismus initialisieren, bevor der Test ausgeführt wird.

Spezifische Quelle

Unten ist die Quelle von Kotlin. Verwenden Sie einfach den Plugin-Mechanismus, um eine TestRule zu definieren, die Ihren Scheduler nur von Android unabhängig macht.

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()
                }
            }
        }
    }
}

Und machen Sie dies einfach vor dem Testen. Übrigens finden Sie in diesem Artikel den Grund, warum Sie `` `@ ClassRule``` nicht verwenden.

@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

So führen Sie mit RxAndroid einen Komponententest mit JVM an einer Quelle durch
Dynamisches Schreiben iterativer Testfälle mit test / unit (Test :: Unit)
So führen Sie einen Komponententest für Spring AOP durch
So testen Sie den privaten Bereich mit JUnit
[Java] So testen Sie, ob es in JUnit null ist
So testen Sie Interrupts während Thread.sleep mit JUnit
So schreiben Sie Testcode mit Basic-Zertifizierung
Machen Sie einen Unit-Test mit Junit.
So schreiben Sie einen Komponententest für Spring Boot 2
Einführung in Micronaut 2 ~ Unit Test ~
Unit-Test der Architektur mit ArchUnit
Wie man mit html.erb nummeriert (nummeriert)
So aktualisieren Sie mit activerecord-import
So autorisieren Sie mit graphql-ruby
Testen des Einschlusses von Bildern bei Verwendung von ActiveStorage und Faker
Festlegen von Umgebungsvariablen bei Verwendung von Payjp mit Rails
So kehren Sie die Kompilierung der Apk-Datei in Java-Quellcode mit MAC um
So führen Sie mit dem Rake-Test von gem nur bestimmte Dateien aus
So erstellen Sie eine App mit Tensorflow mit Android Studio
So löschen Sie das Testbild, nachdem Sie den Rspec-Test mit CarrierWave ausgeführt haben
Erste Schritte mit JDBC mit PostgresSQL unter MacOS
So registrieren Sie sich mit Tomcat als Kunde in Square
Wie fange ich mit schlank an?
Wie man ein Zeichen mit "~" einschließt
Wie man mssql-tools mit alpine benutzt
Beispielcode zum Testen eines Spring Boot-Controllers mit MockMvc
Ich habe getestet, wie man Rubys Test / Gerät und Janken's Code verwendet.
[RSpec] Unit Test (mit gem: factory_bot)
[Schienen] Machen wir einen Unit-Test mit Rspec!
So erstellen Sie CloudStack mit Docker
So starten Sie Camunda mit Docker
Wie kann ich mit NUXTJS Official S3 und CloudFront für AWS bereitstellen? Mit Docker-Compose
Wie man eine hybride Suche mit morphologischer Analyse und Ngram mit Solr realisiert
So testen Sie eine private Methode, die ein Array- oder Argument variabler Länge in JUnit verwendet
So legen Sie verschiedene Quell- / Zielversionen für Produktionscode und Testcode fest
So führen Sie einen Vertrag mit web3j aus
So sortieren Sie eine Liste mit Comparator
So passen Sie TextPosition mit der iOS-Tastaturerweiterung an
So teilen Sie Dateien mit Docker Toolbox
So kompilieren Sie Java mit VsCode & Ant
[Rails] So laden Sie Bilder mit Carrierwave hoch
[Java] Fassen Sie zusammen, wie Sie mit der Methode equals vergleichen können
So filtern Sie den JUnit-Test in Gradle
[Android] Wie man mit dunklen Themen umgeht
Verwendung von BootStrap mit Play Framework
Java Artery - Einfach zu verwendende Unit-Test-Bibliothek
So wechseln Sie Miniaturbilder mit JavaScript
[Java] So berechnen Sie das Alter mit LocalDate
[Hinweis] Erste Schritte mit Rspec
Ich möchte einen Unit Test schreiben!
API-basierte Steuerung mit cancancan
So erreichen Sie den Dateidownload mit Feign
So aktualisieren Sie verwandte Modelle mit accept_nested_attributes_for
So setzen Sie JAVA_HOME mit dem Appassembler-Maven-Plugin von Maven
So implementieren Sie TextInputLayout mit Validierungsfunktion