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
Example of TestScheduler and TestSubject (in Sp...
Search
izumin5210
January 22, 2016
Programming
1.6k
4
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Example of TestScheduler and TestSubject (in Spock)
http://kyobashi-android.connpass.com/event/23975/
izumin5210
January 22, 2016
More Decks by izumin5210
See All by izumin5210
コンパウンドプロダクト開発のためのローカルプロセスマネージャー再発明 #layerxgo
izumin5210
0
740
in-process GraphQL のすすめ #ginzajs
izumin5210
4
1.6k
開発体験を左右するライブラリの API 設計 - GraphQL スキーマ構築ライブラリから考える #tskaigi
izumin5210
2
2.2k
izumin5210のプロポーザルのネタ探し #tskaigi_msup
izumin5210
2
1.1k
AI Agent の開発と運用を支える Durable Execution #AgentsInProd
izumin5210
8
3.2k
AI Agent Tool のためのバックエンドアーキテクチャを考える #encraft
izumin5210
6
2.4k
Building AI Agents with TypeScript #TSKaigiHokuriku
izumin5210
6
1.8k
Web エンジニアが JavaScript で AI Agent を作る / JSConf JP 2025 sponsor session
izumin5210
4
3.6k
AI Coding Meetup #3 - 導入セッション / ai-coding-meetup-3
izumin5210
0
3.8k
Other Decks in Programming
See All in Programming
Kotlinの15年とServer-Side Kotlin
n_takehata
1
150
Atomic Design, Enforced: Scaling Mobile Design Systems (next.app devCon / droidCon Berlin 2026)
steliosf
PRO
0
170
動作中のプログラムの中身をリアルタイムに覗く / Realtime Debugger for CSharp with Roslyn
prota
1
1.9k
APNsからLive Activityを開始する話
yumnumm
0
170
Verilogで学ぶCPU自作入門
uyuki234
8
4.1k
S3 TablesのIcebergデータに、AIエージェントからアクセスしてみた / 20261016developersio2026joetsu-accessing-iceberg-in-s3tables-via-agent
kasacchiful
PRO
0
110
外から家のPCの電源入れたい!をPHPで解決する
kawashimo0
1
130
Simple Storage Service(S3) is not simple
iwatsukayura
0
280
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
740
Railsのためのパスキー実践入門 〜マルチテナントSaaSでの意思決定〜
utakaha
1
320
月間100万人のサービス刷新で、 技術選定をHonoに振り切った話
yutobara
8
6.6k
phperだってパンチカードでコーディングしたい
o0h
PRO
0
320
Featured
See All Featured
Embracing the Ebb and Flow
colly
88
5.2k
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
600
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
1.1k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
3.4k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
750
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
930
Site-Speed That Sticks
csswizardry
13
1.6k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.7k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
18k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
560
Transcript
Example of TestScheduler / TestSubject ( in Spock) Masayuki IZUMI
- @izumin5210 kyobashi.dex #2
> Masayuki IZUMI a.k.a. @izumin5210 > Rekimoto Lab. at the
Univ. of Tokyo > Strobo, Inc. / Wantedly, Inc. > Rubyist / Androider / {Java,Type}Scripter
DEB %SPJE,BJHJ %": 300.$
4DBO#-&EFWJDFT $IFDLBWBJMBCJMJUZPGTDBOOFEEFWJDFT
public Observable<ScanResult> scan(long timespan, TimeUnit unit) { return scanner.startScan() .filter(result
-> !cache.isCached(result)) .flatMap(cache::put) .buffer(timespan, unit) .filter(results -> !results.isEmpty()) .flatMap(this::checkAvailability) .doOnSubscribe(() -> cache.removeAll().subscribe()); }
public Observable<ScanResult> scan(long timespan, TimeUnit unit) { return scanner.startScan() .filter(result
-> !cache.isCached(result)) .flatMap(cache::put) .buffer(timespan, unit) .filter(results -> !results.isEmpty()) .flatMap(this::checkAvailability) .doOnSubscribe(() -> cache.removeAll().subscribe()); }
)PXEPXFXSJUFVOJUUFTU
5FTU4DIFEVMFS5FTU4VCKFDU BOE5FTU4VCTDSJCFS
public final Observable<List<T>> buffer(long timespan, TimeUnit unit) { return buffer(timespan,
unit, Integer.MAX_VALUE, Schedulers.computation()); } 0CTFSWBCMF5CVGGFS MPOH 5JNF6OJU VTFTDPNQVUBUJPOTDIFEVMFSJOEFGBVMU
public Observable<ScanResult> scan(long timespan, TimeUnit unit, Scheduler scheduler) { return
scanner.startScan() .filter(result -> !cache.isCached(result)) .flatMap(cache::put) .buffer(timespan, unit, scheduler) .filter(results -> !results.isEmpty()) .flatMap(this::checkAvailability) .doOnSubscribe(() -> cache.removeAll().subscribe()); }
public Observable<ScanResult> scan(long timespan, TimeUnit unit, Scheduler scheduler) { return
scanner.startScan() .filter(result -> !cache.isCached(result)) .flatMap(cache::put) .buffer(timespan, unit, scheduler) .filter(results -> !results.isEmpty()) .flatMap(this::checkAvailability) .doOnSubscribe(() -> cache.removeAll().subscribe()); }
given: def unit = TimeUnit.MILLISECONDS def scheduler = new TestScheduler()
def subject = TestSubject.<ScanResult>create(scheduler) def subscriber = new TestSubscriber() def subscription = repo.scan(3000, unit, schueduler) .subscribe(subscriber) // stubbing scanner.startScan() >> subject when: subject.onNext(Mock(ScanResult)) scheduler.triggerActions() then: 1 * cache.isCached(_) >> false 1 * cache.put(_) >> { Observable.just(it) } 0 * api._ subscriber.assertValueCount(0) when: scheduler.advanceTimeBy(3000, unit) then: 1 * api.check({ it.size() == 1 }) >> Observable.just([...]) subscriber.assertValueCount(1)
given: def unit = TimeUnit.MILLISECONDS def scheduler = new TestScheduler()
def subject = TestSubject.<ScanResult>create(scheduler) def subscriber = new TestSubscriber() def subscription = repo.scan(3000, unit, schueduler) .subscribe(subscriber) // stubbing scanner.startScan() >> subject
given: def unit = TimeUnit.MILLISECONDS def scheduler = new TestScheduler()
def subject = TestSubject.<ScanResult>create(scheduler) def subscriber = new TestSubscriber() def subscription = repo.scan(3000, unit, schueduler) .subscribe(subscriber) // stubbing scanner.startScan() >> subject
given: def unit = TimeUnit.MILLISECONDS def scheduler = new TestScheduler()
def subject = TestSubject.<ScanResult>create(scheduler) def subscriber = new TestSubscriber() def subscription = repo.scan(3000, unit, schueduler) .subscribe(subscriber) // stubbing scanner.startScan() >> subject
given: def unit = TimeUnit.MILLISECONDS def scheduler = new TestScheduler()
def subject = TestSubject.<ScanResult>create(scheduler) def subscriber = new TestSubscriber() def subscription = repo.scan(3000, unit, schueduler) .subscribe(subscriber) // stubbing scanner.startScan() >> subject
when: subject.onNext(Mock(ScanResult)) scheduler.triggerActions() then: 1 * cache.isCached(_) >> false 1
* cache.put(_) >> { Observable.just(it) } 0 * api._ subscriber.assertValueCount(0)
when: subject.onNext(Mock(ScanResult)) scheduler.triggerActions() then: 1 * cache.isCached(_) >> false 1
* cache.put(_) >> { Observable.just(it) } 0 * api._ subscriber.assertValueCount(0)
when: subject.onNext(Mock(ScanResult)) scheduler.triggerActions() then: 1 * cache.isCached(_) >> false 1
* cache.put(_) >> { Observable.just(it) } 0 * api._ subscriber.assertValueCount(0)
when: subject.onNext(Mock(ScanResult)) scheduler.triggerActions() then: 1 * cache.isCached(_) >> false 1
* cache.put(_) >> { Observable.just(it) } 0 * api._ subscriber.assertValueCount(0) scanner.startScan() .filter(result -> !cache.isCached(result)) .flatMap(cache::put) .buffer(timespan, unit, scheduler) .filter(results -> !results.isEmpty()) .flatMap(this::checkAvailability) .doOnSubscribe(() -> ...));
when: subject.onNext(Mock(ScanResult)) scheduler.triggerActions() then: 1 * cache.isCached(_) >> false 1
* cache.put(_) >> { Observable.just(it) } 0 * api._ subscriber.assertValueCount(0) scanner.startScan() .filter(result -> !cache.isCached(result)) .flatMap(cache::put) .buffer(timespan, unit, scheduler) .filter(results -> !results.isEmpty()) .flatMap(this::checkAvailability) .doOnSubscribe(() -> ...));
when: subject.onNext(Mock(ScanResult)) scheduler.triggerActions() then: 1 * cache.isCached(_) >> false 1
* cache.put(_) >> { Observable.just(it) } 0 * api._ subscriber.assertValueCount(0) scanner.startScan() .filter(result -> !cache.isCached(result)) .flatMap(cache::put) .buffer(timespan, unit, scheduler) .filter(results -> !results.isEmpty()) .flatMap(this::checkAvailability) .doOnSubscribe(() -> ...)); IBTOPUSFBDIFE
when: scheduler.advanceTimeBy(3000, unit) then: 1 * api.check({ it.size() == 1
}) >> Observable.just([...]) subscriber.assertValueCount(1)
when: scheduler.advanceTimeBy(3000, unit) then: 1 * api.check({ it.size() == 1
}) >> Observable.just([...]) subscriber.assertValueCount(1) DVSSFOUUJNFNTNT
when: scheduler.advanceTimeBy(3000, unit) then: 1 * api.check({ it.size() == 1
}) >> Observable.just([...]) subscriber.assertValueCount(1)
when: scheduler.advanceTimeBy(3000, unit) then: 1 * api.check({ it.size() == 1
}) >> Observable.just([...]) subscriber.assertValueCount(1) scanner.startScan() .filter(result -> !cache.isCached(result)) .flatMap(cache::put) .buffer(timespan, unit, scheduler) .filter(results -> !results.isEmpty()) .flatMap(this::checkAvailability) .doOnSubscribe(() -> ...));
when: scheduler.advanceTimeBy(3000, unit) then: 1 * api.check({ it.size() == 1
}) >> Observable.just([...]) subscriber.assertValueCount(1) scanner.startScan() .filter(result -> !cache.isCached(result)) .flatMap(cache::put) .buffer(timespan, unit, scheduler) .filter(results -> !results.isEmpty()) .flatMap(this::checkAvailability) .doOnSubscribe(() -> ...));
5FTU4DIFEVMFS5FTU4VCKFDUBSFVTFGVMGPS UFTUJOHUJNFEFQFOEFOUDPEF *OUFSBDUJPOCBTFEUFTUJOHJO4QPDLJTBXFTPNF
Example of TestScheduler / TestSubject ( in Spock) Masayuki IZUMI
- @izumin5210 kyobashi.dex #2