模拟方法出错

时间:2017-11-07 14:08:59

标签: android testing kotlin mockito

我尝试模拟项目中的一些方法,以便在调用它们时返回某个值。 但是当你运行测试时,它们会随输出而下降:

  

org.mockito.exceptions.misusing.InvalidUseOfMatchersException:   参数匹配器的使用无效! 0匹配预期,1记录:    - >在com.hodzi.stackviewer.questions.detail.QuestionDetailPresenterTest.voteTest(QuestionDetailPresenterTest.kt:69)

     

如果匹配器与原始值组合,则可能会发生此异常:       //不正确:       someMethod(anyObject(),“raw String”);使用匹配器时,所有参数都必须由匹配器提供。例如:       //正确:       someMethod(anyObject(),eq(“by matcher”));

如果在调试模式下运行相同的代码并运行所有行,则在调用shared.getToken()时,将返回我们指定的值。但是在正常启动时,测试就属于这条线。

代码:

import com.hodzi.stackviewer.questions.QuestionsInteractor
import com.hodzi.stackviewer.utils.Shared
import com.hodzi.stackviewer.utils.Vote
import org.junit.BeforeClass
import org.junit.Test
import org.mockito.ArgumentMatchers
import org.mockito.Mockito


internal class QuestionDetailPresenterTest {
    companion object {
        lateinit var presenter: QuestionDetailPresenter
        lateinit var view: QuestionDetailView

        @BeforeClass @JvmStatic
        fun setUp() {
            val questionsInteractor: QuestionsInteractor =
                Mockito.mock(QuestionsInteractor::class.java)

            val shared: Shared =
                Mockito.mock(Shared::class.java)

            Mockito.`when`(shared.getToken()).thenReturn("23")

//            Mockito.doReturn("23").`when`(shared).getToken()


            view = Mockito.mock(QuestionDetailView::class.java)
            presenter = QuestionDetailPresenter(questionsInteractor, shared)
        }

    }
    @Test
    fun voteTest() {
        presenter.vote(ArgumentMatchers.anyInt(), Vote.QUESTION_DOWN)
        Mockito.verify(view).goToAuth()    
    }

}

共享:

interface Shared {
    companion object {
        const val KEY_TOKEN: String = "keyToken"
    }

    fun getToken(): String

    fun saveToken(token: String?)
}

主讲人:

class QuestionDetailPresenter(val questionsInteractor: QuestionsInteractor, val shared: Shared) :
    BasePresenter<QuestionDetailView>() {
    lateinit var question: Question

    fun vote(id: Int, vote: Vote) {
        print(vote)
        if (Strings.isEmptyString(shared.getToken())) {
            view?.goToAuth()
            return
        }

        val observable: Observable<out Data> = when (vote) {
            Vote.ANSWER_UP     -> {
                questionsInteractor.answerUpVote(id, shared.getToken())
            }
            Vote.ANSWER_DOWN   -> {
                questionsInteractor.answerDownVote(id, shared.getToken())
            }
            Vote.QUESTION_UP   -> {
                questionsInteractor.questionUpVote(id, shared.getToken())
            }
            Vote.QUESTION_DOWN -> {
                questionsInteractor.questionDownVote(id, shared.getToken())
            }
        }
        baseObservableData(observable,
            { data ->
                run {
                    Log.d(Const.LOG_TAG, "success")
                }
            },
            { throwable ->
                run {
                    Log.d(Const.LOG_TAG, "error")
                }
            }
        )
    }
}

谢谢!

1 个答案:

答案 0 :(得分:1)

你嘲笑shared没有错,我认为问题在于:

 presenter.vote(ArgumentMatchers.anyInt(), Vote.QUESTION_DOWN)

只需使用真实的Int代替ArgumentMatchers.anyInt()。 喜欢

presenter.vote(0, Vote.QUESTION_DOWN)

匹配模拟对象上的参数时使用匹配器,例如

val calulator = (mock with Mockito)
when(calculator.divideByTwo(anyInt()).thenReturn(1)
使用任何calculator.divideByTwo(int: Int)调用时,

意味着1会返回Int

调用真实对象的方法来测试它们时(就像使用演示者一样),使用真实参数。