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
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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
690
in-process GraphQL のすすめ #ginzajs
izumin5210
4
1.5k
開発体験を左右するライブラリの API 設計 - GraphQL スキーマ構築ライブラリから考える #tskaigi
izumin5210
2
2.2k
izumin5210のプロポーザルのネタ探し #tskaigi_msup
izumin5210
2
1.1k
AI Agent の開発と運用を支える Durable Execution #AgentsInProd
izumin5210
8
3.1k
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
Security issues being discussed on Web Platforms
petamoriken
0
1.1k
AI活用は、個人から組織へ|マルチプレイヤーエージェントハーネス「QM」の社内活用事例 / AI use is moving from individuals to orgs
rkaga
1
150
AIは賢い。でも実行環境は? CLIおじさんがAI時代に伝えたいこと ~ CLIおじさんがAI時代に伝えたいこと ~
curekoshimizu
1
250
TiDB Cloudのカスタムコントローラーによるオートスケール対応
takaidohigasi
0
130
UnityでSystem.Net.WebSocketsなWebSocketサーバが動かないのでUnity Monoのコードを覗いてみた / about implementing websocket server with unity mono
drumath2237
1
300
世界の中心で、AI(App Intents)をさけぶ ー App Intents中心設計の実践ガイド
touyou
0
650
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
510
MVNOの申込からeSIM開通までをiOSアプリでつなぐ- 本人確認・MNP・通信事業者基盤をまたぐ実装
satotakeshi
0
460
Are APIs Still Relevant in the AI Era?
soyuka
0
300
モデルのリファクタリングが難しいと思ったら、そもそも複雑だったのはビジネス仕様だった ? / is-the-business-domain-the-real-complexity
hatsu38
0
390
一人だけ、Kiroが静止する日
hideg
0
130
AGENTS.md Is Not Enough:Build Skills, Don't Download Them
lx_t
0
130
Featured
See All Featured
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
830
sira's awesome portfolio website redesign presentation
elsirapls
0
420
Git: the NoSQL Database
bkeepers
PRO
432
67k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
500
We Have a Design System, Now What?
morganepeng
55
8.3k
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
410
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
990
Embracing the Ebb and Flow
colly
88
5.2k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
910
The agentic SEO stack - context over prompts
schlessera
0
940
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Why Our Code Smells
bkeepers
PRO
340
58k
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