android - 模拟方法出错

标签 android testing kotlin mockito

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

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: Invalid use of argument matchers! 0 matchers expected, 1 recorded: -> at com.hodzi.stackviewer.questions.detail.QuestionDetailPresenterTest.voteTest(QuestionDetailPresenterTest.kt:69)

This exception may occur if matchers are combined with raw values: //incorrect: someMethod(anyObject(), "raw String"); When using matchers, all arguments have to be provided by matchers. For example: //correct: someMethod(anyObject(), eq("String by matcher"));

如果您在 Debug模式下运行相同的代码并遍历所有行,那么当您调用 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")
                }
            }
        )
    }
}

谢谢!

最佳答案

你对shared的 mock 没有错,我认为问题在于:

 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

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

关于android - 模拟方法出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47160000/

相关文章:

java - 如何在 Ktor 中散列和验证密码?

安卓 org.apache.http.client.HttpResponseException : Not Found

javascript - Angular - 单元测试按键

testing - 函数调用中的测试或 clojure 中的语句未运行

java - Kotlin 文件是否应该放在 Android 中的单独源目录中?

android - 当我尝试将更改监听器添加到搜索栏时,应用程序关闭(Android Studio,Kotlin)

android - 如何创建带有图标和文本的切换按钮

java - 获取天数

android - MediaPlayer 不会循环播放。 setLooping() 不起作用

c# - 在 Visual Studio 中找不到数据生成计划