Help us understand the problem. What is going on with this article?

Android×Mockito×Kotlin×入門

Android×Mockito×Kotlin×入門

はじめに

mockito-kotlinを初めて使う人でも5分で理解できるようにを目標とした導入メモ

ユニットテストの大まかな流れ

①モック生成
②テスト実行
③テスト検証
④検証結果

build.gradle

testImplementation "com.nhaarman:mockito-kotlin:1.5.0"

kotlinでmockitoを使うため上記を宣言

サンプル

今回は以下のサンプルクラスを用意し、ユニットテストを行う。

MainActivity
    class MainActivity : AppCompatActivity(), MainContact.View {

        private val presenter:MainContact.Presenter by inject{ parametersOf(this) }

        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            val userName =  presenter.getName(1)
            println(userName)
        }

    }
MainPresenter
    class MainPresenter(private val view:MainContact.View, private val repository:SampleRepository):MainContact.Presenter{

        override fun getName(id:Int):String{
            return repository.getUserById(id)
        }
    }
SampleRepositoryImp
    class SampleRepositoryImp:SampleRepository {

        override fun getUserById(id:Int):String{
            if (id != 0){
                return "taro"
            }else {
                return "error"
            }
        }
    }

デモ

MainPresenterTest
    class MainPresenterTest {

        //モッククラス生成
        private val repositoryMock = mock<SampleRepository> {
            on { getUserById(1) } doReturn "taro"
            on { getUserById(0) } doReturn "error"
        }
        private val viewMock = mock<MainContact.View> {}

        //テスト対象クラス生成
        private val mainPresenter:MainPresenter = MainPresenter(viewMock, repositoryMock)

        @Test
        fun getUserTest() {

            //メソッド実行
            val test1 = mainPresenter.getName(1)
            val test2 = mainPresenter.getName(0)

            //指定のメソッドの呼ばれた回数確認
            verify(repositoryMock, times(1)).getUserById(1)

            //戻り値確認
            assertEquals("taro", test1)
            assertEquals("error", test2)
        }
    }

※今回はMainPresentergetUser()のテストを行う。
そのため、他クラスはモック化する

~➀クラス生成~

モックの生成

    private val repositoryMock = mock<SampleRepository> {
        on { getUserById(1) } doReturn "taro"
        on { getUserById(0) } doReturn "error"
    }

A = mock

モック化する

repositoryMock = mock<SampleRepository>

SampleRepositoryをモック化する

on { A() } doReturn B

引数と返り値を定義

    on { getUserById(1) } doReturn "taro"

SampleRepository.getUserById()を1で呼ぶと"taro"が返ってくる

テスト対象クラス生成

        private val mainPresenter:MainPresenter = MainPresenter(viewMock, repositoryMock)

上記でモック化したクラスを引数としてテストクラスを生成

~➁実行~

            val test1 = mainPresenter.getName(1)
            val test2 = mainPresenter.getName(0)

指定した条件でメソッドを実行

~➂テスト検証~

verify

メソッドが指定した回数呼ばれたかチェック

        verify(repositoryMock, times(1)).getUserById(1)

repositoryMock.getUserById(1)が1回呼ばれているか

assertEquals

戻り値は指定したものかチェック

    val test1 = mainPresenterTest.getName(1)
    assertEquals("taro", test1)

mainPresenterTest.getName(1)の戻り値は"taro"

~➃検証結果~

・全て条件が合っていれば以下が表示される

Process finished with exit code 0

今回の場合、
getName(1)のとき、返り値がtaroで、repositoryMock.getUserById(1)が1回呼ばれていて、
getName(0)のとき、返り値がerrorなら、
Process finished with exit code 0が表示され成功となる

終わりに

KotlinでMockitoを使う方の助けになれれば幸いです。

サンプル:https://github.com/teaTreeTree/MockitoKotlinSample

参照

https://qiita.com/ralph/items/8a4b77007d0c20bada01

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした