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
Annotationを利用した現在時刻のテスト
Search
えぐ
May 10, 2017
900
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Annotationを利用した現在時刻のテスト
Android Testing Bootcamp #6 で発表した資料です
えぐ
May 10, 2017
More Decks by えぐ
See All by えぐ
KotshiからMoshi-codegenに 乗り換えた経緯
egugue
0
2.5k
エンジニアにしてもよいこと エンジニアからお願いしたいこと
egugue
0
180
コードで事前条件を表明する
egugue
3
3.9k
Backends for Frontends を適用した話
egugue
1
1.2k
FlexboxLayoutの紹介
egugue
2
350
Robolectricの @Configを共通化する方法
egugue
0
910
Featured
See All Featured
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
Context Engineering - Making Every Token Count
addyosmani
9
1.1k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
The World Runs on Bad Software
bkeepers
PRO
72
12k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
Docker and Python
trallard
47
4.2k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
350
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
450
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
3k
30 Presentation Tips
portentint
PRO
1
390
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
4.8k
GraphQLとの向き合い方2022年版
quramy
50
15k
Transcript
AnnotationΛ༻͍ͨ ݱࡏ࣌ࠁͷςετ Android Testing Bootcamp #6 2017/5/10
ࣗݾհ • ֎ࢁ ࣏༝ (@duane0728) • Ϡϑʔגࣜձࣾ
ݱࡏ࣌ࠁΛͬͨίʔυͷ ϢχοτςετͲ͏ॻ͍ͯ·͔͢ʁ
class Foo { String getRelativeTime(Model model) { long now
= System.currentTimeMillis(); long timestamp = model.timestamp(); int diff = 1; // do something return diff + "ޙ"; } }
class Foo { String getRelativeTime(Model model) { long now
= System.currentTimeMillis(); long timestamp = model.timestamp(); int diff = 1; // do something return diff + "ޙ"; } }
Ұൠతʹߟ͑ΒΕΔΓํ
1.ɹϝιουͷҾʹ͢Α͏ʹ͢Δ ΧϓηϧԽ͕ଛͳΘΕΔʢέʔεʹΑΔʣ 2.ɹςετઐ༻ͷϝιουΛ༻ҙ͢Δ ϓϩμΫγϣϯίʔυʹςετઐ༻ͷίʔυ͕ೖͬͯ͠·͏ 3.ɹݱࡏ࣌ࠁΛฦ͢ઐ༻ΫϥεΛ༻ҙ͢Δ ɹςετରΫϥεͷґଘ͕ؔ૿͑Δ 4.ɹݱࡏ࣌ࠁΛฦ͢ϝιουΛςετରΫϥεʹ༻ҙ͢Δ ɹݱࡏ࣌ࠁ͕ඞཁͳΫϥεશͯʹ༻ҙ͠ͳ͍͚ͯ͘ͳ͍
1.ɹϝιουͷҾʹ͢Α͏ʹ͢Δ 2.ɹςετઐ༻ͷϝιουΛ༻ҙ͢Δ ɹɹ 3.ɹݱࡏ࣌ࠁΛฦ͢ઐ༻ΫϥεΛ༻ҙ͢Δ ɹ 4.ɹݱࡏ࣌ࠁΛฦ͢ϝιουΛςετରΫϥεʹ༻ҙ͢Δ ɹ
class Foo { String getRelativeTime(Model model, long now) {
// do something } }
1.ɹϝιουͷҾʹ͢Α͏ʹ͢Δ ΧϓηϧԽ͕ଛͳΘΕΔʢέʔεʹΑΔʣ 2.ɹςετઐ༻ͷϝιουΛ༻ҙ͢Δ 3.ɹݱࡏ࣌ࠁΛฦ͢ઐ༻ΫϥεΛ༻ҙ͢Δ ɹ 4.ɹݱࡏ࣌ࠁΛฦ͢ϝιουΛςετରΫϥεʹ༻ҙ͢Δ ɹ
1.ɹϝιουͷҾʹ͢Α͏ʹ͢Δ ΧϓηϧԽ͕ଛͳΘΕΔʢέʔεʹΑΔʣ 2.ɹςετઐ༻ͷϝιουΛ༻ҙ͢Δ 3.ɹݱࡏ࣌ࠁΛฦ͢ઐ༻ΫϥεΛ༻ҙ͢Δ ɹ 4.ɹݱࡏ࣌ࠁΛฦ͢ϝιουΛςετରΫϥεʹ༻ҙ͢Δ ɹ
class Foo { String getRelativeTime(Model model) { long now
= System.currentTimeMillis(); } @VisibleForTesting String getRelativeTime(Model model, long now) { } }
1.ɹϝιουͷҾʹ͢Α͏ʹ͢Δ ΧϓηϧԽ͕ଛͳΘΕΔʢέʔεʹΑΔʣ 2.ɹςετઐ༻ͷϝιουΛ༻ҙ͢Δ ςετରΫϥεʹςετઐ༻ͷίʔυ͕ೖͬͯ͠·͏ 3.ɹݱࡏ࣌ࠁΛฦ͢ઐ༻ΫϥεΛ༻ҙ͢Δ ɹ 4.ɹݱࡏ࣌ࠁΛฦ͢ϝιουΛςετରΫϥεʹ༻ҙ͢Δ ɹ
1.ɹϝιουͷҾʹ͢Α͏ʹ͢Δ ΧϓηϧԽ͕ଛͳΘΕΔʢέʔεʹΑΔʣ 2.ɹςετઐ༻ͷϝιουΛ༻ҙ͢Δ ςετରΫϥεʹςετઐ༻ͷίʔυ͕ೖͬͯ͠·͏ 3.ɹݱࡏ࣌ࠁΛฦ͢ઐ༻ΫϥεΛ༻ҙ͢Δ ɹ 4.ɹݱࡏ࣌ࠁΛฦ͢ϝιουΛςετରΫϥεʹ༻ҙ͢Δ ɹ
class Foo { private final NowProvider provider; @Inject
Foo(NowProvider provider) { this.provider = provider; } String getRelativeTime(Model model) { long now = provider.get(); } } class NowProvider { long get() { return System.currentTimeMillis(); } }
1.ɹϝιουͷҾʹ͢Α͏ʹ͢Δ ΧϓηϧԽ͕ଛͳΘΕΔʢέʔεʹΑΔʣ 2.ɹςετઐ༻ͷϝιουΛ༻ҙ͢Δ ςετରΫϥεʹςετઐ༻ͷίʔυ͕ೖͬͯ͠·͏ 3.ɹݱࡏ࣌ࠁΛฦ͢ઐ༻ΫϥεΛ༻ҙ͢Δ ɹςετରΫϥεͷґଘ͕ؔ૿͑Δ 4.ɹݱࡏ࣌ࠁΛฦ͢ϝιουΛςετରΫϥεʹ༻ҙ͢Δ ɹ
1.ɹϝιουͷҾʹ͢Α͏ʹ͢Δ ΧϓηϧԽ͕ଛͳΘΕΔʢέʔεʹΑΔʣ 2.ɹςετઐ༻ͷϝιουΛ༻ҙ͢Δ ςετରΫϥεʹςετઐ༻ͷίʔυ͕ೖͬͯ͠·͏ 3.ɹݱࡏ࣌ࠁΛฦ͢ઐ༻ΫϥεΛ༻ҙ͢Δ ɹςετରΫϥεͷґଘ͕ؔ૿͑Δ 4.ɹݱࡏ࣌ࠁΛฦ͢ϝιουΛςετରΫϥεʹ༻ҙ͢Δ ɹ
class Foo { String getRelativeTime(Model model) { long now
= now(); } // ςετ࣌ʹpartial mockԽ @VisibleForTesting long now() { return System.currentTimeMillis(); } }
1.ɹϝιουͷҾʹ͢Α͏ʹ͢Δ ΧϓηϧԽ͕ଛͳΘΕΔʢέʔεʹΑΔʣ 2.ɹςετઐ༻ͷϝιουΛ༻ҙ͢Δ ςετରΫϥεʹςετઐ༻ͷίʔυ͕ೖͬͯ͠·͏ 3.ɹݱࡏ࣌ࠁΛฦ͢ઐ༻ΫϥεΛ༻ҙ͢Δ ɹςετରΫϥεͷґଘ͕ؔ૿͑Δ 4.ɹݱࡏ࣌ࠁΛฦ͢ϝιουΛςετରΫϥεʹ༻ҙ͢Δ ɹݱࡏ࣌ࠁ͕ඞཁͳΫϥεશͯʹ༻ҙ͠ͳ͍͚ͯ͘ͳ͍
1.ɹϝιουͷҾʹ͢Α͏ʹ͢Δ ΧϓηϧԽ͕ଛͳΘΕΔʢέʔεʹΑΔʣ 2.ɹςετઐ༻ͷϝιουΛ༻ҙ͢Δ ςετରΫϥεʹςετઐ༻ͷίʔυ͕ೖͬͯ͠·͏ 3.ɹݱࡏ࣌ࠁΛฦ͢ઐ༻ΫϥεΛ༻ҙ͢Δ ɹςετରΫϥεͷґଘ͕ؔ૿͑Δ 4.ɹݱࡏ࣌ࠁΛฦ͢ϝιουΛςετରΫϥεʹ༻ҙ͢Δ ɹݱࡏ࣌ࠁ͕ඞཁͳΫϥεશͯʹ༻ҙ͠ͳ͍͚ͯ͘ͳ͍
ͲΕҰҰ
YukiMatsumura / Now https://github.com/YukiMatsumura/Now
Now • ݱࡏ࣌ࠁΛฦ͢staticͳϝιουΛͭΫϥεΛ༻ҙ͢Δ • ݱࡏ࣌ࠁΛ͍͍ͨΫϥεɺ͜ͷstaticϝιουΛ͏ • ςετ࣌ʹAnnotationΛͬͯɺݱࡏ࣌ࠁΛࢦఆͰ͖Δ ৄ͘͠Γ͍ͨํGithubʂ
public class Jsr310Time { private static Clock clock =
Clock.systemUTC(); public static long now() { return clock.millis(); } // ... }
class Foo { String getRelativeTime(Model model) { long now
= Jsr310Time.now(); } }
public class FooTest { @Rule Jsr310TimeRule rule = new
Jsr310TimeRule(); @Now("2017-05-01T00:00:00Z") @Test public void test() { } }
ΧϓηϧԽ͕ଛͳΘΕ͍ͯͳ͍ ςετରΫϥεʹςετઐ༻ͷίʔυ͕ೖΒͳ͍ ςετରΫϥεͷґଘ͕ؔ૿͑ͳ͍ ϘΠϥʔϓϨʔτ͕গͳ͍
ΧϓηϧԽ͕ଛͳΘΕ͍ͯͳ͍ ςετରΫϥεʹςετઐ༻ͷίʔυ͕ೖΒͳ͍ ςετରΫϥεͷґଘ͕ؔ૿͑ͳ͍ ϘΠϥʔϓϨʔτ͕গͳ͍ ISO8601Ͱͷهड़͕ͪΐͬͱͭΒ͍ (ݸਓతʹ)
Now with Kotlin
Now with Kotlin • KotlinAnnotationʹίϯετϥΫλΛએݴͰ͖Δ • ͜ͷػೳΛͬͯɺISO8061Ͱͳ͘intܕͰΛද͢ https://github.com/YukiMatsumura/Now#kotlin
@Target(AnnotationTarget.FUNCTION) annotation class Now( val year: Int, val month: Int,
val dayOfMonth: Int, val hour: Int, val minute: Int, val second: Int = 0 ) https://kotlinlang.org/docs/reference/annotations.html#constructors
class FooTest { @Rule @JvmField val rule = Jsr310TimeRule()
@Now(2017, 5, 1, 0, 0, 0) @Test fun test() { } }
ΧϓηϧԽ͕ଛͳΘΕ͍ͯͳ͍ ςετରΫϥεʹςετઐ༻ͷίʔυ͕ೖΒͳ͍ ςετରΫϥεͷґଘ͕ؔ૿͑ͳ͍ ϘΠϥʔϓϨʔτ͕গͳ͍ ࣌ΛIntͰදݱͰ͖ɺannotate͘͢͠ɺಡΈ͍͢(ݸਓతʹ)
·ͱΊ • ݱࡏ࣌ࠁʹґଘͨ͠ςετͷΞϓϩʔνෳ • ͲΕҰҰ • AnnotationΛ༻͍ͨํ๏ັྗతͳΞϓϩʔν ͥͻݕ౼ͯ͠Έ͍ͯͩ͘͞
͋Γ͕ͱ͏͍͟͝·ͨ͠