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
Annotationを利用した現在時刻のテスト
Search
えぐ
May 10, 2017
0
870
Annotationを利用した現在時刻のテスト
Android Testing Bootcamp #6 で発表した資料です
えぐ
May 10, 2017
Tweet
Share
More Decks by えぐ
See All by えぐ
KotshiからMoshi-codegenに 乗り換えた経緯
egugue
0
2.4k
エンジニアにしてもよいこと エンジニアからお願いしたいこと
egugue
0
180
コードで事前条件を表明する
egugue
3
3.6k
Backends for Frontends を適用した話
egugue
1
1.2k
FlexboxLayoutの紹介
egugue
2
330
Robolectricの @Configを共通化する方法
egugue
0
850
Featured
See All Featured
Agile that works and the tools we love
rasmusluckow
329
21k
GraphQLとの向き合い方2022年版
quramy
49
14k
Optimizing for Happiness
mojombo
379
70k
Building a Modern Day E-commerce SEO Strategy
aleyda
43
7.4k
Optimising Largest Contentful Paint
csswizardry
37
3.4k
jQuery: Nuts, Bolts and Bling
dougneiner
64
7.8k
It's Worth the Effort
3n
186
28k
Practical Orchestrator
shlominoach
190
11k
The World Runs on Bad Software
bkeepers
PRO
70
11k
Documentation Writing (for coders)
carmenintech
73
5k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
46
7.6k
Gamification - CAS2011
davidbonilla
81
5.4k
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Λ༻͍ͨํ๏ັྗతͳΞϓϩʔν ͥͻݕ౼ͯ͠Έ͍ͯͩ͘͞
͋Γ͕ͱ͏͍͟͝·ͨ͠