Unit Test 探求記は、unit test に関してまったりと実験しつつその過程を綴ってみるというものです。
今回のお題
MainThread(Ui Thread)の unit test を行ってみます。
テスト対象
今回は、current thread が main thread かどうかを判断する val を作成して、それをテスト対象とします。
◆ isMainThread
val isMainThread: Boolean
get() = Thread.currentThread() == Looper.getMainLooper().thread
Unit Test
-
Looper
を直接利用するので、instrumented test を用います。 -
@UiThreadTest
を用いて main thread 上での実行をテストします。 - Assertion に
Google Truth
,AssertJ
,Hamcrest
を利用してみます。1
◆ build.gradle.kts
UiThreadTest
, Google Truth
, AssertJ
への依存関係を追加します。
// for androidx.test.annotation.UiThreadTest
androidTestImplementation("androidx.test:rules:1.2.0")
// for Google Truth
androidTestImplementation("com.google.truth:truth:1.0.1")
// for AssertJ
androidTestImplementation("org.assertj:assertj-core:3.12.2")
◆ Unit Test
使い勝手の違いに興味があったので、Assetion に Junit
, Google Truth
, AssertJ
, Hamcrest
を同時に利用してみました。1
/**
* Running on worker thread.
*/
@Test
fun isMainThread_ReturnsFalse() {
// Junit
Assert.assertFalse(isMainThread)
// Google Truth
Truth.assertThat(isMainThread).isFalse()
// AssertJ
Assertions.assertThat(isMainThread).isFalse()
// Hamcrest
MatcherAssert.assertThat(isMainThread, `is`(false))
}
/**
* Running on main thread.
*/
@Test
@UiThreadTest
fun isMainThread_ReturnsTrue() {
// Junit
Assert.assertTrue(isMainThread)
// Google Truth
Truth.assertThat(isMainThread).isTrue()
// AssertJ
Assertions.assertThat(isMainThread).isTrue()
// Hamcrest
MatcherAssert.assertThat(isMainThread, `is`(true))
}
◆ テスト結果
下記のように、テストに成功しました。
$ ./gradlew connectedAndroidTest
> Task :android:connectedDebugAndroidTest
Starting 2 tests on ASUS_X00PD - 8.0.0
BUILD SUCCESSFUL in 33s
59 actionable tasks: 9 executed, 50 up-to-date
まとめ
今回は、@UiThreadTest
を用いた main thread のテストを行い、Assetion に Junit
, Google Truth
, AssertJ
, Hamcrest
を利用してみました。