Как выполнить модульное тестирование на моем модернизированном презентере с помощью mockito? - PullRequest
0 голосов
/ 28 апреля 2020

Я хочу провести модульное тестирование с использованием зависимостей mockito в моем коде. всегда происходит сбой, потому что view.processMatchData (data) и view.hideLoading () являются частью замыкания в этом коде презентатора, поэтому модульный тест не обнаружит их. Пожалуйста, кто-нибудь, помогите мне решить эту проблему.

open class MatchSearchPresenter(
    private val view: MatchSearchView,
    private val apiService: ApiService,
    private val cari : String
) {
    fun searchMatch() {
        view.showLoading()
        apiService.loadSearchMatch(cari).enqueue(object : Callback<MatchSearchResponseModel> {
                override fun onResponse(call: Call<MatchSearchResponseModel>, response: Response<MatchSearchResponseModel>)
                {
                    if (response.isSuccessful) {
                        val data = response.body()!!
                        view.processMatchData(data)
                    }
                    view.hideLoading()
                }

                override fun onFailure(call: Call<MatchSearchResponseModel>, error: Throwable)
                {
                    Log.e("Error", error.message)
                    view.hideLoading()
                }
        })
    }
}

вот мой модульный тест:

class MatchSearchPresenterTest {
    @Mock
    private lateinit var view: MatchSearchView
    @Mock
    private lateinit var apiService: ApiService
    @Mock
    private lateinit var teamPresenter: MatchSearchPresenter
    @Mock
    private lateinit var call: Call<MatchSearchResponseModel>
    @Mock
    private lateinit var something: Callback<MatchSearchResponseModel>


    @Before
    fun setUp() {
        MockitoAnnotations.initMocks(this)
        val kata = "Man United"
        teamPresenter = MatchSearchPresenter(view, apiService, kata )
    }
    @Test
    fun searchMatch() {
        val teamId = "Man United"
        val teams: MutableList<PrevMatchData> = mutableListOf()
        val data = MatchSearchResponseModel(teams)

        teamPresenter.searchMatch()

        argumentCaptor<MatchSearchView>().apply {
            Mockito.verify(apiService.loadSearchMatch(teamId).enqueue(something))
            firstValue.processMatchData(data)
            firstValue.hideLoading()
        }

        Mockito.verify(view).showLoading()
        Mockito.verify(view).processMatchData(data)
        Mockito.verify(view).hideLoading()
    }
}

, но это не работает, показывая следующее сообщение:

java.lang.NullPointerException
    at com.example.footballleaguecataloguefourth.ui_bottom_navigation.schedule.match_search.MatchSearchPresenter.searchMatch(MatchSearchPresenter.kt:19)
    at com.example.footballleaguecataloguefourth.ui_bottom_navigation.schedule.match_search.MatchSearchPresenterTest.searchMatch(MatchSearchPresenterTest.kt:41)

1 Ответ

0 голосов
/ 28 апреля 2020

Я думаю, что вам нужно, чтобы вызов, возвращаемый ApiService, вызывал правильный метод, как только он был поставлен в очередь.

Для этого вы можете использовать thenAnswer - в Mockito. Вот пример. В вашем случае вы можете попробовать это:

Mockito.`when`(call.enqueue(Mockito.any())).thenAnswer {
    (it.getArgument(0) as Callback<MatchSearchResponseModel>).onResponse(
        call,
        Response.success(MatchSearchResponseModel(/*whatever is needed to build this object*/))
    )
}

Здесь вы убедитесь, что после вызова call.enqueue с любым аргументом он немедленно вызовет метод onResponse с успешным ответом. Вы можете сделать что-то подобное для ошибки, а также позвонить по номеру onFailure.

Последнее, что вам нужно сделать, это убедиться, что ваша служба API возвращает настроенный макет call:

 Mockito.`when`(apiService.loadSearchMatch(kata)).thenReturn(call)

Я бы поставил это на тест. Поэтому, прежде чем вызывать метод презентатора, я настроил макеты следующим образом.

Теперь, вызов teamPresenter.searchMatch(), должен вызвать apiService.loadSearchMatch(cari), который вернет ложный вызов, который после постановки в очередь вызовет переданный обратный вызов. onResponse method.

Наконец, как вы могли заметить, when на самом деле написано с обратными метками. Это потому, что это ключевое слово kotlin, которое необходимо экранировать. Не только по этой причине, но и по многим другим, вы можете рассмотреть возможность использования Mockito Kotlin, который является превосходным kotlin библиотечным обертыванием mockito и значительно облегчает жизнь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...