Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Testing & RxJava2 (AppBuilders 2018)
Search
Sasa Sekulic
April 16, 2018
Programming
460
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Testing & RxJava2 (AppBuilders 2018)
With RxJava you can write some complex, multithreaded code - and testing it is easy!
Sasa Sekulic
April 16, 2018
More Decks by Sasa Sekulic
See All by Sasa Sekulic
Testing & RxJava2 (GrowIT Serbia 2018)
mrsasha
0
110
Management for developers v.2
mrsasha
0
82
Management for developers
mrsasha
1
240
Reactive programming on Android - why and how v2 (CodeMobile 2017)
mrsasha
0
150
Reactive programming on Android - why and how (Droidcon Krakow 2016)
mrsasha
0
310
Reactive programming on Android - why and how (Droidcon UK 2016)
mrsasha
6
580
Recipes in RxJava for Android, v.3
mrsasha
1
290
Recipes in RxJava for Android, v.2
mrsasha
3
1.4k
Recipes in RxJava for Android
mrsasha
7
1.7k
Other Decks in Programming
See All in Programming
iOSDC2026登壇資料.pdf
riofujimon
0
160
From 6 People Classroom Meetup to 100 People Regional Conference / FOSS4G Hiroshima 2026
furukawayasuto
0
200
Starting & Sustaining Code-Based E2E Testing for Non-Coding QA Teams( #jasstniigata )
teyamagu
PRO
1
180
AGENTS.md Is Not Enough:Build Skills, Don't Download Them
lx_t
0
120
Vue Fes Japan 2026 タイムテーブル徹底解説
448jp
0
130
選挙速報を多くのユーザーへ 届ける Live Activities 設計
hamayokokuririn
0
140
cdk deploy JawsSonic #MARATHONしながらAWSリソースをデプロイしてみよう
akihisaikeda
2
130
技術的負債を組織課題として解く-増えすぎたマイクロサービスとの戦い-
reimaru
1
1.8k
App Storeの外へ──日本のiOSサイドローディング入門 for iOSDC Japan 2026
yuukiw00w
0
210
AWS DevOps Agentで インシデント対応をAIに任せたい
honmarkhunt
7
2.9k
AI × TiDD / 2026.09.05 Redmine 大阪
tokudiro
1
160
Kiroで創り、AgentCoreで繋ぐ!AWSで実践する「AI-DLC」から「AIエージェント統合」までの最新地図
licux
4
680
Featured
See All Featured
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
460
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
6
1.2k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.6k
The SEO Collaboration Effect
kristinabergwall1
1
560
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
460
Building Adaptive Systems
keathley
44
3.2k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.6k
4 Signs Your Business is Dying
shpigford
187
23k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.6k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.2k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
490
Transcript
None
None
test() Observable.just(1) .test() .assertValue(1) val subject = PublishSubject.create<Int>()
val subject = PublishSubject.create<Int>() subject.onNext(1) subject.test() .assertValueCount(1) .assertValue(1)
TestObserver val testObserver = Observable.just(1).test() testObserver.assertValue(1) val subject
= PublishSubject.create<Int>() val testObserver = subject.test() val testObserver = subject.test() subject.onNext(1) testObserver.assertValueCount(1) testObserver.assertValue(1) subject.onNext(2) testObserver.assertValueCount(2) testObserver.assertValues(1, 2)
Observable.just(1) .test() .assertValueCount(1) .assertValue(1) .assertValue({ it == 1 }) .assertNoValues()
.assertValuesOnly(1) Observable.just(1, 2) .test() .assertValueCount(2) .assertValues(1, 2) .assertValueAt(0, 1) .assertValueAt(0) { it == 1 } .assertNever(3)
Observable.just(1) .test() .assertTerminated() .assertComplete() .assertNoErrors() .assertSubscribed() .assertNotComplete() .assertNotTerminated() .assertNotTerminated() .assertEmpty()
.assertError(PaymentException("test")) .assertError(PaymentMethodNotSupportedException::class.java) .assertError({error -> error.cause == PaymentException("test")}) .assertErrorMessage("test")
assertResult() assertSubscribed().assertValues() .assertNoErrors().assertComplete() Observable.just(1, 2).test() .assertResult(1, 2) assertFailure()
assertSubscribed().assertValues() .assertError().assertNotComplete() Observable.error<Int>(RuntimeException("test")).test() .assertFailure(RuntimeException::class.java) .assertFailure(Predicate { it -> it == RuntimeException() }) .assertFailureAndMessage(RuntimeException::class.java, "test")
assertFailure() Observable.error<Int>(RuntimeException("test")) .startWith(Observable.just(1, 2)) .test() .assertFailure(RuntimeException::class.java, 1, 2) .assertFailure(RuntimeException::class.java)
.assertFailure(Predicate { it -> it == RuntimeException() }) .assertFailureAndMessage(RuntimeException::class.java, "test")
val zippedObservable1 = Observable.error<Int>(Throwable("error 1")) val zippedObservable2 = Observable.error<Int>(Throwable("error 2"))
Observable.zip(zippedObservable1, zippedObservable2, BiFunction({first: Observable.zip(zippedObservable1, zippedObservable2, BiFunction({first: Int, second: Int -> first + second})) .test() .assertErrorMessage("error 1") .assertErrorMessage("error 2")
Observable.just(1).test() .await() .await(1, TimeUnit.SECONDS) Observable.just(1).test() .awaitTerminalEvent() Observable.just(1, 2) Observable.just(1, 2)
.delay (2, TimeUnit.SECONDS) .test() .awaitDone(2, TimeUnit.SECONDS) .awaitCount(2, BaseTestConsumer.TestWaitStrategy.SLEEP_1000MS, 2000) .assertTimeout()
Schedulers Observable.just(1) .observeOn(Schedulers.io()) .test() .assertValue(1) Schedulers Schedulers
Schedulers
Schedulers RxJavaPlugins.setIoSchedulerHandler { Schedulers.trampoline() } Observable.just(1) .observeOn(Schedulers.io()) .test() .assertValue(1) Schedulers
Schedulers RxJavaPlugins.setIoSchedulerHandler { Schedulers.trampoline() } RxJavaPlugins.setComputationSchedulerHandler { Schedulers.trampoline() } RxJavaPlugins.setNewThreadSchedulerHandler { Schedulers.trampoline() } Schedulers RxAndroidPlugins.reset() RxAndroidPlugins.setInitMainThreadSchedulerHandler {Schedulers.trampoline()}
Schedulers @Rule class TrampolineSchedulerRule : TestRule { override fun apply(base:
Statement, d: Description): Statement { return object : Statement() { @Throws(Throwable::class) override fun evaluate() { RxJavaPlugins.setIoSchedulerHandler… try { base.evaluate() } finally { RxJavaPlugins.reset() } } } } }
Schedulers @Rule @Rule val schedulerRule = TrampolineSchedulerRule() https://medium.com/@fabioCollini/testing-asynchronous-rxjava-code-using-mockito-
8ad831a16877 https://www.infoq.com/articles/Testing-RxJava
Schedulers Schedulers interface SchedulerProvider { fun ui(): Scheduler fun computation():
Scheduler fun io(): Scheduler } class AppSchedulerProvider : SchedulerProvider { override fun ui() = AndroidSchedulers.mainThread() override fun computation() = Schedulers.computation() override fun io() = Schedulers.io() } class TrampolineSchedulerProvider : SchedulerProvider { override fun ui() = Schedulers.trampoline() override fun computation() = Schedulers.trampoline() override fun io() = Schedulers.trampoline() }
Schedulers class UsesSchedulerProvider (schedulers: SchedulerProvider) { … … }
fun methodWithWorker(scheduler: Scheduler): AtomicInteger { val counter = AtomicInteger() val
worker = scheduler.createWorker() worker.schedule({ counter.incrementAndGet() }) worker.schedule({ counter.incrementAndGet() }) return counter } val scheduler = TestScheduler() val counter = methodWithWorker(scheduler) Assert.assertEquals(2, counter.get()) testScheduler.triggerActions() Assert.assertEquals(2, counter.get())
TestScheduler val timedoutObservable = Observable.never<Int>() .timeout(5, TimeUnit.SECONDS) timedoutObservable.test() .assertError(TimeoutException::class.java) timeout()
timeout(5, TimeUnit.SECONDS) == timeout(5, TimeUnit.SECONDS, Schedulers.computation())
TestScheduler val scheduler = TestScheduler() val timedoutObservable = Observable.never<Int>() val
timedoutObservable = Observable.never<Int>() .timeout(5, TimeUnit.SECONDS, ,scheduler) advanceTimeBy() scheduler.advanceTimeBy(5, TimeUnit.SECONDS) timedoutObservable.test() .assertError(TimeoutException::class.java)
TestScheduler TestScheduler val scheduler = TestScheduler(2, TimeUnit.SECONDS) advanceTimeTo() Scheduler.advanceTimeTo(5, TimeUnit.SECONDS)
TestScheduler TestScheduler val currentTime = scheduler.now(TimeUnit.SECONDS)