Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
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
in-process GraphQL のすすめ #ginzajs
izumin5210
4
1.2k
開発体験を左右するライブラリの API 設計 - GraphQL スキーマ構築ライブラリから考える #tskaigi
izumin5210
2
2k
izumin5210のプロポーザルのネタ探し #tskaigi_msup
izumin5210
2
1k
AI Agent の開発と運用を支える Durable Execution #AgentsInProd
izumin5210
8
3k
AI Agent Tool のためのバックエンドアーキテクチャを考える #encraft
izumin5210
6
2.3k
Building AI Agents with TypeScript #TSKaigiHokuriku
izumin5210
6
1.8k
Web エンジニアが JavaScript で AI Agent を作る / JSConf JP 2025 sponsor session
izumin5210
4
3.5k
AI Coding Meetup #3 - 導入セッション / ai-coding-meetup-3
izumin5210
0
3.8k
Web フロントエンドエンジニアに開かれる AI Agent プロダクト開発 - Vercel AI SDK を観察して AI Agent と仲良くなろう! #FEC余熱NIGHT
izumin5210
3
1.3k
Other Decks in Programming
See All in Programming
React本体のコードリーディング
high_g_engineer
1
150
torikago - Ruby::Boxで照らすモジュラモノリスの実行境界
se4weed
1
380
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
620
ルールを書いて終わらせないハーネスエンジニアリング
yug1224
5
1.9k
数百円から始めるRuby電子工作
tarosay
0
160
freee が目指す データ マネジメント戦略 AI-Ready 時代を支える 攻めのガバナンスとは
freee
PRO
0
400
2年かけて Deno に DOMMatrix を実装した話 / How I implemented DOMMatrix in Deno over two years
petamoriken
0
210
テーブルをDELETEした
yuzneri
0
140
Go 1.27 における memory allocation の高速化
andpad
0
210
AWS DevOps AgentのAzure接続機能を検証して見えた活用法/Use Cases Verified for the AWS DevOps Agent's Azure Connectivity Feature
masakiokuda
1
240
ソフトウェア設計に溶けるインフラ ― AWS CDK のインフラ認識論
konokenj
3
800
プロポーザルを書いてもらう
pvcresin
0
550
Featured
See All Featured
Visualization
eitanlees
152
17k
Building an army of robots
kneath
306
46k
It's Worth the Effort
3n
188
29k
Skip the Path - Find Your Career Trail
mkilby
1
180
The World Runs on Bad Software
bkeepers
PRO
72
12k
Agile that works and the tools we love
rasmusluckow
331
22k
The Curse of the Amulet
leimatthew05
2
14k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.3k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
630
Designing for Timeless Needs
cassininazir
1
440
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
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