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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
980
in-process GraphQL のすすめ #ginzajs
izumin5210
4
1.6k
開発体験を左右するライブラリの API 設計 - GraphQL スキーマ構築ライブラリから考える #tskaigi
izumin5210
2
2.3k
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.9k
Web エンジニアが JavaScript で AI Agent を作る / JSConf JP 2025 sponsor session
izumin5210
4
3.7k
AI Coding Meetup #3 - 導入セッション / ai-coding-meetup-3
izumin5210
0
3.8k
Other Decks in Programming
See All in Programming
AI-Powered Domain-Driven Design
ziobrando
0
390
Next.js: The final boss of Web Performance
guaca
0
380
TanStack Vue Query と Pinia Colada から学ぶ非同期状態の型設計
aoshi
0
620
Apple Intelligenceとオンデバイス時代の到来
yahir0
0
210
Kotlinize Is Not Just Converting to Kotlin
chigichan24
1
220
作って学ぶSpring BootのAuto Configuration / JJUG Night Seminar 2026-10-19
rshindo
0
220
高橋メソッドでCVE解説シリーズ 〜CVE-2026-112816〜
hakkadaikon
0
210
Materialが消えた日 〜真っ白なFlutterキャンバスにRenderObjectで絵を描く〜
umigishiaoi
0
150
プロジェクトコードをキレイキレイしよう!暗黙的な参照を読み解く静的解析
ostk0069
0
200
Modernizing iOS Apps
seyfoyun
0
150
まずはコードより業務と向き合う:テーブル解体のためにPdMを呼んだ話
sakawe_ee
0
150
Spec-driven Development with AI
simas
PRO
0
2.2k
Featured
See All Featured
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
610
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
320
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.4k
First, design no harm
axbom
PRO
2
1.4k
GraphQLとの向き合い方2022年版
quramy
50
15k
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
480
Crafting Experiences
bethany
1
420
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
1.1k
A Modern Web Designer's Workflow
chriscoyier
699
190k
Evolving SEO for Evolving Search Engines
ryanjones
0
350
Google's AI Overviews - The New Search
badams
0
1.7k
Writing Fast Ruby
sferik
630
63k
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