「【第9回】potatotips(iOS/Android開発Tips共有会)」の発表資料です。 Android Studio / Gradle で、RobolectricとPowerMockを併用する方法を説明しています。 設定さえしてしまえば、Android StudioでサクサクTDDできますので、ぜひお試しください!
ʙϨΨγʔίʔυͱಆ͏ͨΊʹʙ RobolectricͰPowerMockΛ͏2014.09.24 @sumio_tym (TOYAMA Sumio)potatotips (iOS/Android։ൃTipsڞ༗ձ) ୈ9ճ
View Slide
ࣗݾհ• ࢯ໊: ֎ࢁ७ੜ(TOYAMA Sumio) @sumio_tym (twitter), @sumio (github) • ॴଐ: NTTιϑτΣΞגࣜձࣾ • ۀ༰: – ࣾAndroidؔ࿈ϓϩδΣΫτٕज़ࢧԉ – Androidؔ࿈ࣾݚमߨࢣ • ϓϥΠϕʔτ: – STAR (ςετࣗಈԽݚڀձ) – Androidͷࣗಈςετ༻ͷIMEΛެ։ͯ͠·͢ https://github.com/sumio/uiautomator-‐unicode-‐input-‐helper 2
• Androidͷ୯ମςετɺͲ͏ͯ͠·͔͢? – Robolectric + Mockito • AndroidͰϨΨγʔίʔυͱಆΘͳ͖Ό͍͚ͳ͍͜ͱɺͳ͍Ͱ͔͢? • staticϝιουfinalϝιουΛࠩ͠ସ͑ͨ͘ͳΔ͜ͱɺͳ͍Ͱ͔͢?3 ͡Ίʹ
հ͢ΔTipsRobolectricͰPowerMockΛ͏ํ๏Λհ͠·͢(Android Studioฤ)4 ҙ֎ͱ໘!
Robolectric• JVM্ͰAndroidͷ୯ମςετ͕Ͱ͖Δ! • http://robolectric.org/5 ग़య: http://robolectric.org/
PowerMock with Mockito• https://code.google.com/p/powermock/ • staticɾfinalϝιουࠩ͠ସ͑ΒΕΔ 6 ग़య: https://code.google.com/p/powermock/wiki/MockitoUsage13
ΞδΣϯμ• Robolectric+PowerMock: ซ༻͕͍͠ཧ༝ • ղܾํ • ϙΠϯτ • ϑΝΠϧͷஔ • gradleରԠ • Android Studioઃఆ • ·ͱΊ 7
Robolectric+PowerMock: ซ༻͕͍͠ཧ༝• ྆ํͱ@RunWithࢦఆ͕ඞཁ – Robolectric – PowerMock8 @RunWith(RobolectricTestRunner.class)public class MyActivityTest {...@RunWith(PowerMockRunner.class)public class YourTestCase {....@RunWithͰࢦఆͰ͖Δςετϥϯφʔ1͚ͭͩ!
ղܾํ• @RunWith: RobolectricTestRunnerΛࢦఆ • PowerMock: PowerMockAgent https://code.google.com/p/powermock/wiki/PowerMockAgent9 @RunWith(RobolectricTestRunner.class)@PrepareForTest(X.class)public class MyActivityPowerMockTest extends {static {PowerMockAgent.initializeIfNeeded();}...
ϙΠϯτ• JDK1.6ඞਢ(JDK1.7Ҏ߱Ͱಈ࡞͠ͳ͍) • robolectric-‐gradle-‐pluginΛ͏ – https://github.com/robolectric/robolectric-‐gradle-‐plugin (masterϒϥϯνͷઌ͕ඞཁ) • ςετ࣮ߦ࣌ʹ͕ඞཁ – Ϋϥεύε: junit-‐4.11Λandroid.jarΑΓલʹ! – ىಈ࣌Ҿ: -‐javaagentΦϓγϣϯ͕ඞཁ 10 -javaagent:/path/to/powermock-module-javaagent-1.5.5.jar
ϑΝΠϧͷஔ11 src/test/javaʹςετίʔυΛஔsrc/test/resʹ RobolectricͷConfigϑΝΠϧΛஔ
GradleରԠ(४උ)• robolectric-‐gradle-‐pluginͷmasterઌΛϏϧυ͢Δ – όʔδϣϯએݴมߋ – gradle install 12 ...group = 'org.robolectric'version = '0.13.0-SNAPSHOT'...
GradleରԠ(build.gradle 1/4)13 buildscript {repositories {mavenCentral()mavenLocal()}dependencies {classpath 'com.android.tools.build:gradle:0.12.+'classpath 'org.robolectric:robolectric-gradle-plugin:0.13.+'}}apply plugin: 'android'apply plugin: 'robolectric'// ...ଓ͘...robolectric-‐gradle-‐plugin ϩʔΧϧʹΠϯετʔϧͨ͠ͷΛ͏'robolectric'ϓϥάΠϯΛద༻
GradleରԠ(build.gradle 2/4)14 android {...sourceSets {androidTest {setRoot('src/test')}...}}// ...ଓ͘...src/testʹςετίʔυΛஔ͘
GradleରԠ(build.gradle 3/4)15 dependencies {repositories {mavenCentral()}androidTestCompile 'org.powermock:powermock-module-junit4:1.5.5'androidTestCompile 'org.powermock:powermock-api-mockito:1.5.5'androidTestCompile 'org.powermock:powermock-module-junit4-rule-agent:1.5.5'androidTestCompile('org.robolectric:robolectric:2.3') {exclude module: 'commons-logging'exclude module: 'httpclient'exclude module: 'support-v4'}}// ...ଓ͘...PowerMockAgentΛՃ
GradleରԠ(build.gradle 4/4)16 robolectric {ignoreFailures truedef agentJar = configurations.androidTestCompile.files { dep ->(dep.group == 'org.powermock') &&(dep.name == 'powermock-module-junit4-rule-agent')}.find { it.name.startsWith 'powermock-module-javaagent' }jvmArgs "-javaagent:${agentJar.absolutePath}"}powermock-‐module-‐javaagentͷjarϑΝΠϧͷॴࡏΛ୳ͯ͠ɺjvmArgsʹηοτ͢Δrobolectric { ... }dependencies { ... }ΑΓޙʹએݴ͢Δ
Android Studioઃఆ(1/3)17 • Android͡Όͳ͍[All Test]ΛΒࣦͤͯഊͤ͞Δ • ΤϥʔͱҰॹʹग़ྗ͞ΕΔίϚϯυϥΠϯ͔ΒΫϥεύεΛదͳΤσΟλʹίϐʔ
18 • -‐classpathͷฤू • junit-‐4.11.jarΛઌ಄ʹҠಈ • build/test-‐classesͷύεΛඌʹՃ • powermock-‐module-‐javaagent-‐1.5.5.jarΛ-‐javaagentΦϓγϣϯͱͯ͠Ճ • -‐javaagent:/path/to/powermock-‐module-‐javaagent-‐1.5.5.jar
Android Studioઃఆ(2/3)19 • [Run]>[Edit Configurations...]ͷ[JUnit]σϑΥϧτΛมߋ ฤूͨ͠ͷΛషΓ͚Δςετ࣮ߦલʹ gradle testDebugClasses Λςετ࣮ߦ͢ΔΑ͏ʹઃఆ͢Δ
Android Studioઃఆ(3/3)• ςετ͍ͨ͠ϝιουΫϥεͰҎԼͷૢ࡞Λ͢Εςετ͕࣮ߦͰ͖Δ – ӈΫϦοΫˠRunˠAndroidͰͳ͍ํͷςετ20 ͜ͷΞΠίϯͷํΛબͿ
·ͱΊ• AndroidStudioͰɺRobolectricͱPowerMockΛซ༻͢Δํ๏Λհ͠·ͨ͠ɻ • PowerMockΛΘ͟ΔΛಘͳ͍ϨΨγʔίʔυʹૺ۰ͨ͠ͱ͖ʹ͓͍͍ͩ͘͞ɻ • ॳظઃఆ͑͞ऴΘΕɺշదʹ͑·͢! 21 ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠
ࢀߟURL• robolectric-‐gradle-‐plugin – https://github.com/robolectric/robolectric-‐gradle-‐plugin • Robolectricར༻࣌ͷbuild.gradleͷαϯϓϧ – https://github.com/robolectric/deckard-‐gradle • Android StudioͰRobolectricͷςετΛ࣮ߦ͢Δํ๏Λղઆͨ͠ϒϩάهࣄ – ʮAndroid Studio͔ΒRobolectricͷςετΛ࣮ߦ͢Δ-‐ ΄͛΄͛ʢԾʣʯhttp://starzero.hatenablog.com/entry/2014/05/13/19442222