【问题标题】:Error with mock methods模拟方法错误
【发布时间】:2017-11-07 14:08:58
【问题描述】:

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

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

如果匹配器与原始值组合,则可能会发生此异常: //不正确: someMethod(anyObject(), "原始字符串");使用匹配器时,所有参数都必须由匹配器提供。例如: //正确的: someMethod(anyObject(), eq("String 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")
                }
            }
        )
    }
}

谢谢!

【问题讨论】:

    标签: android testing kotlin mockito


    【解决方案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) 在与任何Int 一起调用时返回1

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-04
      • 1970-01-01
      • 1970-01-01
      • 2023-01-14
      • 1970-01-01
      • 2020-02-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多