Slide 1

Slide 1 text

Resource management in Robolectric Keishin Yokomaku / potatotips #36 @ Money Forward, Inc.

Slide 2

Slide 2 text

Resource management in Robolectric About Me ▸ Keishin Yokomaku ▸ Drivemode, Inc. / Principal Engineer ▸ KeithYokoma: GitHub / Twitter / Qiita / Tumblr / Stack Overflow ▸ Books: Android Academia / Grimoire of Android / Nanairo Android ▸ Fun: Gymnastics / Cycling / Photography / Motorsport ▸ Today’s Quote: “Happy DroidKaigi!” 2

Slide 3

Slide 3 text

Resource management in Robolectric Robolectric? ▸ Android testing framework running on JVM ▸ Emulates Android framework behavior in JVM, instead of device or emulator ▸ Has tons of mock implementation on framework and system services ▸ Popular choice of testing framework in Android development ▸ Frequently combined with Mockito 3

Slide 4

Slide 4 text

Resource management in Robolectric 4 ·ͩ3PCPMFDUSJDͰ ফ໣ͯ͠Δͷʁ

Slide 5

Slide 5 text

Resource management in Robolectric 5 ؾܰʹݴͬͯ͘ΕΔͳ͋

Slide 6

Slide 6 text

Resource management in Robolectric Latest update in Robolectric ▸ API 24 & 25 support ▸ Configuration file location change ▸ $app_module/src/test/resources/your/package/name/robolectric.properties ▸ Resource loading updates & modifications ▸ Easy customization for RobolectricTestRunner ▸ etc… 6

Slide 7

Slide 7 text

Resource management in Robolectric Latest update in Robolectric ▸ API 24 & 25 support ▸ Configuration file location change ▸ $app_module/src/test/resources/your/package/name/robolectric.properties ▸ Resource loading updates & modifications ▸ Easy customization for RobolectricTestRunner ▸ etc… 7

Slide 8

Slide 8 text

Resource management in Robolectric 8

Slide 9

Slide 9 text

Resource management in Robolectric 9

Slide 10

Slide 10 text

Resource management in Robolectric 10

Slide 11

Slide 11 text

Resource management in Robolectric 11

Slide 12

Slide 12 text

Resource management in Robolectric Steps to execute a test method 1.Load test class 2.Invoke @BeforeClass if any 3.Set up test environment based on @Config or robolectric.properties 4.Reset static states 5.Load system resources and app resources 6.Invoke @Before, @Test, @After methods 12

Slide 13

Slide 13 text

Resource management in Robolectric Steps to execute a test method 1.Load test class 2.Invoke @BeforeClass if any 3.Set up test environment based on @Config or robolectric.properties 4.Reset static states 5.Load system resources and app resources 6.Invoke @Before, @Test, @After methods 13

Slide 14

Slide 14 text

Resource management in Robolectric From Robolectric 3.1.3 ▸ Robolectric has a table which maps all resources (app and system resources) ▸ Put all resources in the memory 14 System Resources App Resources AssetManager string drawable layout ok yes no en: No fr: Non ja: ͍͍͑

Slide 15

Slide 15 text

Resource management in Robolectric How to resolve resource from resource id in the test 15 System Resources App Resources AssetManager string drawable layout ok yes no en: No fr: Non ja: ͍͍͑ context.getString(R.string.no) # R.string.no => 17049821

Slide 16

Slide 16 text

Resource management in Robolectric How to resolve resource from resource id in the test 16 System Resources App Resources AssetManager string drawable layout ok yes no en: No fr: Non ja: ͍͍͑ 1000001000000000001001100 context.getString(R.string.no) # R.string.no => 17049821

Slide 17

Slide 17 text

Resource management in Robolectric How to resolve resource from resource id in the test 17 System Resources App Resources AssetManager string drawable layout ok yes no en: No fr: Non ja: ͍͍͑ 1000001000000000001001100 >>> 24 context.getString(R.string.no) # R.string.no => 17049821

Slide 18

Slide 18 text

Resource management in Robolectric How to resolve resource from resource id in the test 18 System Resources App Resources AssetManager string drawable layout ok yes no en: No fr: Non ja: ͍͍͑ 1000001000000000001001100 >>> 24 0000000000000000000000001 context.getString(R.string.no) # R.string.no => 17049821

Slide 19

Slide 19 text

Resource management in Robolectric How to resolve resource from resource id in the test 19 System Resources App Resources AssetManager string drawable layout ok yes no en: No fr: Non ja: ͍͍͑ 1000001000000000001001100 >>> 24 0000000000000000000000001 == pointing to System Resources context.getString(R.string.no) # R.string.no => 17049821

Slide 20

Slide 20 text

Resource management in Robolectric How to resolve resource from resource id in the test 20 System Resources App Resources AssetManager string drawable layout ok yes no en: No fr: Non ja: ͍͍͑ 1000001000000000001001100 >>> 24 0000000000000000000000001 == pointing to System Resources context.getString(R.string.no) # R.string.no => 17049821

Slide 21

Slide 21 text

Resource management in Robolectric How to resolve resource from resource id in the test 21 System Resources App Resources AssetManager string drawable layout ok yes no en: No fr: Non ja: ͍͍͑ 1000001000000000001001100 >>> 24 0000000000000000000000001 == pointing to System Resources ResourceIndex#getResName(resourceId) context.getString(R.string.no) # R.string.no => 17049821

Slide 22

Slide 22 text

Resource management in Robolectric How to resolve resource from resource id in the test 22 System Resources App Resources AssetManager string drawable layout ok yes no en: No fr: Non ja: ͍͍͑ 1000001000000000001001100 >>> 24 0000000000000000000000001 == pointing to System Resources ResourceIndex#getResName(resourceId) ResName{android:string/no} context.getString(R.string.no) # R.string.no => 17049821

Slide 23

Slide 23 text

Resource management in Robolectric How to resolve resource from resource id in the test 23 System Resources App Resources AssetManager string drawable layout ok yes no en: No fr: Non ja: ͍͍͑ 1000001000000000001001100 >>> 24 0000000000000000000000001 == pointing to System Resources ResourceIndex#getResName(resourceId) ResName{android:string/no} type == string context.getString(R.string.no) # R.string.no => 17049821

Slide 24

Slide 24 text

Resource management in Robolectric How to resolve resource from resource id in the test 24 System Resources App Resources AssetManager string drawable layout ok yes no en: No fr: Non ja: ͍͍͑ 1000001000000000001001100 >>> 24 0000000000000000000000001 == pointing to System Resources ResourceIndex#getResName(resourceId) ResName{android:string/no} type == string context.getString(R.string.no) # R.string.no => 17049821

Slide 25

Slide 25 text

Resource management in Robolectric How to resolve resource from resource id in the test 25 System Resources App Resources AssetManager string drawable layout ok yes no en: No fr: Non ja: ͍͍͑ 1000001000000000001001100 >>> 24 0000000000000000000000001 == pointing to System Resources ResourceIndex#getResName(resourceId) ResName{android:string/no} type == string ResName{android:string/no} context.getString(R.string.no) # R.string.no => 17049821

Slide 26

Slide 26 text

Resource management in Robolectric How to resolve resource from resource id in the test 26 System Resources App Resources AssetManager string drawable layout ok yes no en: No fr: Non ja: ͍͍͑ 1000001000000000001001100 >>> 24 0000000000000000000000001 == pointing to System Resources ResourceIndex#getResName(resourceId) ResName{android:string/no} type == string ResName{android:string/no} ResName{android:string/ok} context.getString(R.string.no) # R.string.no => 17049821

Slide 27

Slide 27 text

Resource management in Robolectric How to resolve resource from resource id in the test 27 System Resources App Resources AssetManager string drawable layout ok yes no en: No fr: Non ja: ͍͍͑ 1000001000000000001001100 >>> 24 0000000000000000000000001 == pointing to System Resources ResourceIndex#getResName(resourceId) ResName{android:string/no} type == string ResName{android:string/no} ResName{android:string/yes} context.getString(R.string.no) # R.string.no => 17049821

Slide 28

Slide 28 text

Resource management in Robolectric How to resolve resource from resource id in the test 28 System Resources App Resources AssetManager string drawable layout ok yes no en: No fr: Non ja: ͍͍͑ 1000001000000000001001100 >>> 24 0000000000000000000000001 == pointing to System Resources ResourceIndex#getResName(resourceId) ResName{android:string/no} type == string ResName{android:string/no} ResName{android:string/no} context.getString(R.string.no) # R.string.no => 17049821

Slide 29

Slide 29 text

Resource management in Robolectric How to resolve resource from resource id in the test 29 System Resources App Resources AssetManager string drawable layout ok yes no en: No fr: Non ja: ͍͍͑ 1000001000000000001001100 >>> 24 0000000000000000000000001 == pointing to System Resources ResourceIndex#getResName(resourceId) ResName{android:string/no} type == string ResName{android:string/no} ResName{android:string/no} context.getString(R.string.no) # R.string.no => 17049821

Slide 30

Slide 30 text

Resource management in Robolectric How to resolve resource from resource id in the test 30 System Resources App Resources AssetManager string drawable layout ok yes no en: No fr: Non ja: ͍͍͑ 1000001000000000001001100 >>> 24 0000000000000000000000001 == pointing to System Resources ResourceIndex#getResName(resourceId) ResName{android:string/no} type == string ResName{android:string/no} ResName{android:string/no} context.getString(R.string.no) # R.string.no => 17049821

Slide 31

Slide 31 text

Resource management in Robolectric How to resolve resource from resource id in the test 31 System Resources App Resources AssetManager string drawable layout ok yes no en: No fr: Non ja: ͍͍͑ 1000001000000000001001100 >>> 24 0000000000000000000000001 == pointing to System Resources ResourceIndex#getResName(resourceId) ResName{android:string/no} type == string ResName{android:string/no} ResName{android:string/no} RuntimeEnvironment.getQualifiers() context.getString(R.string.no) # R.string.no => 17049821

Slide 32

Slide 32 text

Resource management in Robolectric How to resolve resource from resource id in the test 32 System Resources App Resources AssetManager string drawable layout ok yes no en: No fr: Non ja: ͍͍͑ 1000001000000000001001100 >>> 24 0000000000000000000000001 == pointing to System Resources ResourceIndex#getResName(resourceId) ResName{android:string/no} type == string ResName{android:string/no} ResName{android:string/no} RuntimeEnvironment.getQualifiers() en context.getString(R.string.no) # R.string.no => 17049821

Slide 33

Slide 33 text

Resource management in Robolectric How to resolve resource from resource id in the test 33 System Resources App Resources AssetManager string drawable layout ok yes no en: No fr: Non ja: ͍͍͑ 1000001000000000001001100 >>> 24 0000000000000000000000001 == pointing to System Resources ResourceIndex#getResName(resourceId) ResName{android:string/no} type == string ResName{android:string/no} ResName{android:string/no} RuntimeEnvironment.getQualifiers() en context.getString(R.string.no) # R.string.no => 17049821

Slide 34

Slide 34 text

Resource management in Robolectric How to resolve resource from resource id in the test 34 System Resources App Resources AssetManager string drawable layout ok yes no en: No fr: Non ja: ͍͍͑ 1000001000000000001001100 >>> 24 0000000000000000000000001 == pointing to System Resources ResourceIndex#getResName(resourceId) ResName{android:string/no} type == string ResName{android:string/no} ResName{android:string/no} RuntimeEnvironment.getQualifiers() en context.getString(R.string.no) => “No” # R.string.no => 17049821

Slide 35

Slide 35 text

Resource management in Robolectric Keishin Yokomaku / potatotips #36 @ Money Forward, Inc.

Slide 36

Slide 36 text

DroidKaigi Tickets available! http://bit.ly/2gFFK8z 36