====== junit ======
===== Hamkrest - Hamcrest for Kotlin =====
Hamkrestはおそらく一番メジャーなMatcher。
[[https://github.com/npryce/hamkrest/blob/master/README.md|Hamkrest - Hamcrest for Kotlin]]
com.natpryce.hamkrest → kotlin用のhamkrest
org.hamcrest. → 普通のhamkrest
[[https://qiita.com/opengl-8080/items/e57dab6e1fa5940850a3|HamcrestのMatchersに定義されているメソッドの使い方メモ]]
[[https://github.com/npryce/hamkrest/blob/master/docs/function-references.md|Shortcuts: using function references as Matchers]]
dependencies {
・・・
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime:0.13.0"
implementation 'com.natpryce:hamkrest:1.7.0.0' // ADD
import com.natpryce.hamkrest.* // kotlin用のhamkrest
import com.natpryce.hamkrest.assertion.assertThat
import org.junit.Test
class xxxTest {
@Test
fun xxx() {
val actual=GameMaker(1).makePlus()
assertThat("Hello", equalTo("Hello")) //文字列一致
assertThat( Integer.parseInt(actual.ans),allOf(greaterThanOrEqualTo(1), lessThanOrEqualTo(9))) //1~9まで
// listsは1..9まですべてを含む
val contain = Matcher(List::containsAll,listOf(1,2,3,4,5,6,7,8,9))
assertThat(lists,contain )
}
}
===== testでLogをmockする =====
[[https://qiita.com/oxsoft/items/b12b7a6c17e92eb880cd|Method d in android.util.Log not mocked.に対する3つの対処法]]
java.lang.RuntimeException: Method d in android.util.Log not mocked. See http://g.co/androidstudio/not-mocked for details.
==== 対策1.testOptionsを追加する ====
http://g.co/androidstudio/not-mocked
Unit Testsで全てのAndroidクラスが何もしないようになる。
android {
compileSdkVersion 29
・・・
// ↓追加
testOptions {
unitTests.returnDefaultValues = true
}
// ↑追加
}
==== 対策2.PowerMockを使う====
PowerMockは、static関数のMockを作ることができるライブラリ。
インポートするバージョンによってはうまく動作しないようでハマった。
[[https://blog.masterka.net/archives/271|Android+Kotlin+PowerMockitoをやってみた]]
import android.util.Log
import com.natpryce.hamkrest.allOf
import com.natpryce.hamkrest.assertion.assertThat
import com.natpryce.hamkrest.equalTo
import com.natpryce.hamkrest.greaterThanOrEqualTo
import com.natpryce.hamkrest.lessThanOrEqualTo
import org.junit.Test
import org.junit.runner.RunWith
import org.powermock.api.mockito.PowerMockito
import org.powermock.core.classloader.annotations.PrepareForTest
import org.powermock.modules.junit4.PowerMockRunner
@RunWith(PowerMockRunner::class) //ADD
@PrepareForTest(Log::class) //ADD
class GameMakerTest {
@Test
fun makePlus() {
PowerMockito.mockStatic(Log::class.java) //ADD
・・・テスト対処でもテストでもLogがあればmockしてくれる。
}
}