Slide 1

Slide 1 text

ࠓ͔Β͸͡ΊΔSPCPMFDUSJD !NPSJJJNP

Slide 2

Slide 2 text

"ZBLP.PSJNPUP %..DPNMJGFࣄۀ෦ !NPSJJJNP

Slide 3

Slide 3 text

SPCPMFDUSJD

Slide 4

Slide 4 text

SPCPMFDUSJD ࠓճ͓࿩͢Δͷ͸SPCPMFDUSJD ࢼͯ͠ΈͨΑʂͱ͍͏͘Β͍Ͱ͢ ྃ͝ঝ͍ͩ͘͞

Slide 5

Slide 5 text

(FUUJOH4UBSUFE dependencies { testImplementation 'org.robolectric:robolectric:4.1' } android { testOptions { unitTests { includeAndroidResources = true } } }

Slide 6

Slide 6 text

(FUUJOH4UBSUFE # Project-wide Gradle settings. # IDE (e.g. Android Studio) users: # Gradle settings configured through the IDE *will override* # any settings specified in this file. # For more details on how to configure your build environment visit # http://www.gradle.org/docs/current/userguide/build_environment.html # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. org.gradle.jvmargs=-Xmx1536m # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/ multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true android.enableUnitTestBinaryResources=true

Slide 7

Slide 7 text

.BJO"DUJWJUZ class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) title = "Robolectric onCreate" val button = findViewById(R.id.button) button.setOnClickListener { findViewById(R.id.textView).text = "Hello Robolectric" } } override fun onResume() { super.onResume() title = "Robolectric onResume" } }

Slide 8

Slide 8 text

.BJO"DUJWJUZ5FTU @RunWith(RobolectricTestRunner::class) @Config(sdk = [LOLLIPOP]) class MainActivityTest { @Test @Throws(Exception::class) fun activityEventIsCorrect() { val controller = Robolectric.buildActivity(MainActivity::class.java).create().start() val activity = controller.get() assertTrue(activity.title.toString() == "Robolectric onCreate") // onResumeΠϕϯτൃੜ controller.resume() assertTrue(activity.title.toString() == "Robolectric onResume") // onClickΠϕϯτൃੜ activity.findViewById(R.id.button).performClick() assertTrue(activity.findViewById(R.id.textView).text == "Hello Robolectric") } }

Slide 9

Slide 9 text

.BJO"DUJWJUZ5FTU @RunWith(RobolectricTestRunner::class) @Config(sdk = [LOLLIPOP]) class MainActivityTest { @Test @Throws(Exception::class) fun activityEventIsCorrect() { val controller = Robolectric.buildActivity(MainActivity::class.java).create() .start() val activity = controller.get() assertTrue(activity.title.toString() == "Robolectric onCreate") // onResumeΠϕϯτൃੜ controller.resume() assertTrue(activity.title.toString() == "Robolectric onResume") // onClickΠϕϯτൃੜ activity.findViewById(R.id.button).performClick() assertTrue(activity.findViewById(R.id.textView).te xt == "Hello Robolectric") } } @RunWith(RobolectricTestRunner::class)

Slide 10

Slide 10 text

.BJO"DUJWJUZ5FTU @RunWith(RobolectricTestRunner::class) @Config(sdk = [LOLLIPOP]) class MainActivityTest { @Test @Throws(Exception::class) fun activityEventIsCorrect() { val controller = Robolectric.buildActivity(MainActivity::class.java).create() .start() val activity = controller.get() assertTrue(activity.title.toString() == "Robolectric onCreate") // onResumeΠϕϯτൃੜ controller.resume() assertTrue(activity.title.toString() == "Robolectric onResume") // onClickΠϕϯτൃੜ activity.findViewById(R.id.button).performClick() assertTrue(activity.findViewById(R.id.textView).te xt == "Hello Robolectric") } } @Config(sdk = [LOLLIPOP])

Slide 11

Slide 11 text

.BJO"DUJWJUZ5FTU @RunWith(RobolectricTestRunner::class) @Config(sdk = [LOLLIPOP]) class MainActivityTest { @Test @Throws(Exception::class) fun activityEventIsCorrect() { val controller = Robolectric.buildActivity(MainActivity::class.java).create() .start() val activity = controller.get() assertTrue(activity.title.toString() == "Robolectric onCreate") // onResumeΠϕϯτൃੜ controller.resume() assertTrue(activity.title.toString() == "Robolectric onResume") // onClickΠϕϯτൃੜ activity.findViewById(R.id.button).performClick() assertTrue(activity.findViewById(R.id.textView).te xt == "Hello Robolectric") } } @Test @Throws(Exception::class) fun activityEventIsCorrect() { val controller = Robolectric.buildActivity(MainActivit y::class.java).create().start() val activity = controller.get() assertTrue(activity.title.toString() == "Robolectric onCreate")

Slide 12

Slide 12 text

.BJO"DUJWJUZ5FTU @RunWith(RobolectricTestRunner::class) @Config(sdk = [LOLLIPOP]) class MainActivityTest { @Test @Throws(Exception::class) fun activityEventIsCorrect() { val controller = Robolectric.buildActivity(MainActivity::class.java).create() .start() val activity = controller.get() assertTrue(activity.title.toString() == "Robolectric onCreate") // onResumeΠϕϯτൃੜ controller.resume() assertTrue(activity.title.toString() == "Robolectric onResume") // onClickΠϕϯτൃੜ activity.findViewById(R.id.button).performClick() assertTrue(activity.findViewById(R.id.textView).te xt == "Hello Robolectric") } } controller.resume() assertTrue(activity.title.toString() == "Robolectric onResume”) activity.findViewById(R.id.button) .performClick() assertTrue(activity.findViewById (R.id.textView).text == "Hello Robolectric") } }

Slide 13

Slide 13 text

࣮ߦͯ͠ΈΔʂ

Slide 14

Slide 14 text

ʘ͠͹Β͓͘଴ͪԼ͍͞ʗ ʜʜʜ

Slide 15

Slide 15 text

4VDDFTT

Slide 16

Slide 16 text

☺ʁ

Slide 17

Slide 17 text

Ϣʔεέʔε

Slide 18

Slide 18 text

3PPN5PEP%BUBCBTF @Database(entities = [TodoEntity::class], version = 1) abstract class TodoDatabase : RoomDatabase() { abstract fun todoDao(): TodoDao companion object { private var instance: TodoDatabase? = null fun getInstance(context: Context): TodoDatabase = instance ?: synchronized(this) { instance ?: buildDatabase(context).also { instance = it } } private fun buildDatabase(context: Context): TodoDatabase = Room.databaseBuilder( context, TodoDatabase::class.java, TodoDatabase::class.java.simpleName ).build() } }

Slide 19

Slide 19 text

3PPN5PEP&OUJUZ 5PEP%BP @Entity(tableName = "todo") data class TodoEntity( val name: String, val category: Int ) { @PrimaryKey(autoGenerate = true) var id: Int = 0 } @Dao interface TodoDao { @Query("SELECT * FROM todo") fun selectAll(): List @Query("SELECT * FROM todo WHERE id = :id") fun selectById(id: Int): TodoEntity @Insert(onConflict = OnConflictStrategy.REPLACE) fun insertAll(list: List) @Query("SELECT COUNT(*) FROM todo") fun count(): Int }

Slide 20

Slide 20 text

@RunWith(RobolectricTestRunner::class) @Config(sdk = [O_MR1]) class TodoDataBaseTest { private lateinit var database: TodoDatabase @Before fun openDatabase() { database = Room .inMemoryDatabaseBuilder( InstrumentationRegistry.getInstrumentation().targetContext, TodoDatabase::class.java ).allowMainThreadQueries() .build() } @After fun closeDatabase() { database.close() } @Test @Throws(Exception::class) fun insert() { assertThat(database.todoDao().count(), `is`(0)) val list = listOf( TodoEntity( name = "Robolectric࢖͏", category = 1 ), TodoEntity( name = "JUnit࢖͏", category = 1 ) ) database.todoDao().upsertAll(list) assertThat(database.todoDao().count(), `is`(2)) } }

Slide 21

Slide 21 text

@RunWith(RobolectricTestRunner::class) @Config(sdk = [O_MR1]) class TodoDataBaseTest { private lateinit var database: TodoDatabase @Before fun openDatabase() { database = Room .inMemoryDatabaseBuilder( InstrumentationRegistry.getInstrumentation().targetContext, TodoDatabase::class.java ).allowMainThreadQueries() .build() } @After fun closeDatabase() { database.close() } @Test @Throws(Exception::class) fun insert() { assertThat(database.todoDao().count(), `is`(0)) val list = listOf( TodoEntity( name = "Robolectric࢖͏", category = 1 ), TodoEntity( name = "JUnit࢖͏", category = 1 ) ) database.todoDao().upsertAll(list) assertThat(database.todoDao().count(), `is`(2)) } } private lateinit var database: TodoDatabase @Before fun openDatabase() { database = Room .inMemoryDatabaseBuilder( InstrumentationRegistry.getInstrumentat ion().targetContext, TodoDatabase::class.java ).allowMainThreadQueries() .build() }

Slide 22

Slide 22 text

@RunWith(RobolectricTestRunner::class) @Config(sdk = [O_MR1]) class TodoDataBaseTest { private lateinit var database: TodoDatabase @Before fun openDatabase() { database = Room .inMemoryDatabaseBuilder( InstrumentationRegistry.getInstrumentation().targetContext, TodoDatabase::class.java ).allowMainThreadQueries() .build() } @After fun closeDatabase() { database.close() } @Test @Throws(Exception::class) fun insert() { assertThat(database.todoDao().count(), `is`(0)) val list = listOf( TodoEntity( name = "Robolectric࢖͏", category = 1 ), TodoEntity( name = "JUnit࢖͏", category = 1 ) ) database.todoDao().upsertAll(list) assertThat(database.todoDao().count(), `is`(2)) } } @After fun closeDatabase() { database.close() }

Slide 23

Slide 23 text

@RunWith(RobolectricTestRunner::class) @Config(sdk = [O_MR1]) class TodoDataBaseTest { private lateinit var database: TodoDatabase @Before fun openDatabase() { database = Room .inMemoryDatabaseBuilder( InstrumentationRegistry.getInstrumentation().targetContext, TodoDatabase::class.java ).allowMainThreadQueries() .build() } @After fun closeDatabase() { database.close() } @Test @Throws(Exception::class) fun insert() { assertThat(database.todoDao().count(), `is`(0)) val list = listOf( TodoEntity( name = "Robolectric࢖͏", category = 1 ), TodoEntity( name = "JUnit࢖͏", category = 1 ) ) database.todoDao().upsertAll(list) assertThat(database.todoDao().count(), `is`(2)) } } @Test @Throws(Exception::class) fun insert() { assertThat(database.todoDao().count(), `is`(0)) val list = listOf( TodoEntity( name = "Robolectric࢖͏", category = 1 ), TodoEntity( name = "JUnit࢖͏", category = 1 ) ) database.todoDao().insertAll(list) assertThat(database.todoDao().count(), `is`(2)) }

Slide 24

Slide 24 text

No content

Slide 25

Slide 25 text

FYQFDUFEΛΘ͟ͱʹ͢ΔͱͪΌΜͱࣦഊ͠·ͨ͠ ˎ৺഑ͳͷͰҰԠ

Slide 26

Slide 26 text

͋Γ͕ͱ͏͍͟͝·ͨ͠