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
660
in-process GraphQL のすすめ #ginzajs
izumin5210
4
1.5k
開発体験を左右するライブラリの API 設計 - GraphQL スキーマ構築ライブラリから考える #tskaigi
izumin5210
2
2.1k
izumin5210のプロポーザルのネタ探し #tskaigi_msup
izumin5210
2
1.1k
AI Agent の開発と運用を支える Durable Execution #AgentsInProd
izumin5210
8
3.1k
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.6k
AI Coding Meetup #3 - 導入セッション / ai-coding-meetup-3
izumin5210
0
3.8k
Other Decks in Programming
See All in Programming
LLMは4年分のCompose移行を再現できるのか?実プロダクト279件のXMLで探る自動化の境界線
makun
0
470
不幸な GC
chencmd
0
890
Can LLMs Replicate 4 Years of Compose Migration? Exploring the boundaries of automation with 279 XML files from a real product
makun
0
130
フロントエンドUIフレームワークのこれまでとこれから
ssssota
4
1.9k
スマート反転とウェブアクセシビリティ
camiha
0
170
AIとGame Jamで、ゲームを完成させた話
takahirosaeki
0
110
標準パッケージに uuid が追加された 背景から見る Go らしい意思決定 / go_127_uuid_decision
convto
5
5.6k
「AI時代、配布するPythonコードをどう守るか: 難読化の実験と判断軸」 #PyconJP2026
pkshadeck
PRO
2
190
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
150
業務時間外もAIに働いてもらう話
colorful12
3
10k
デプロイ直後のレイテンシスパイクを調べたら、 Railsの仕様にたどり着いた
nhsykym
0
110
App Storeの外へ──日本のiOSサイドローディング入門 for iOSDC Japan 2026
yuukiw00w
0
130
Featured
See All Featured
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
3k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.7k
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
730
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
490
Facilitating Awesome Meetings
lara
57
7.1k
Practical Orchestrator
shlominoach
191
12k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.4k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
The Cult of Friendly URLs
andyhume
79
7k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
69
65k
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