Maradiya Krupa
Maradiya Krupa

Reputation: 283

Test cases to performClick for custom ClicklLstener

I have created one custom click listener like below:

abstract class SingleClickListener : View.OnClickListener {
    private var lastTimeClicked: Long = 0
    private val defaultInterval: Int = 1000
    override fun onClick(v: View) {
        if (SystemClock.elapsedRealtime() - lastTimeClicked < defaultInterval) {
            return
        }
        lastTimeClicked = SystemClock.elapsedRealtime()
        performClick(v)
    }

    abstract fun performClick(v: View)
}

And then in my fragment I have used like below :

binding.textview.setOnClickListener(object : SingleClickListener() {
            override fun performClick(v: View) {
                //navigate to next screen
            }
        })

Now I want to write a test case to perform this custom click. I have tried like below but it is not working and if I'll remove SingleClickListener then the same test case is working fine.

val fragmentScenario = launchFragmentInContainerAndGetFragmentScenario()
            fragmentScenario.onFragment { fragment ->
                val textview = fragment.view?.findViewById<AppCompatTextView>(R.id.textview)

                textview?.performClick()
            }

Can anyone help me how can I call custom ClickListener's performClick function through test case?

Upvotes: 0

Views: 229

Answers (1)

ocos
ocos

Reputation: 2244

You are using SystemClock.elapsedRealtime() which returns elapsed milliseconds since boot. But in unit tests with robolectric you will have Zero for the result of SystemClock.elapsedRealtime() call. Hence, 0 - 0 < 1000 => always true in unit tests.

You can just use System.currentTimeMillis().

abstract class SingleClickListener : View.OnClickListener {

  private var lastTimeClicked: Long = 0
  private val defaultInterval: Int = 1000
  override fun onClick(v: View) {
    val now = System.currentTimeMillis()
    if (now - lastTimeClicked < defaultInterval) {
      return
    }
    lastTimeClicked = now
    performClick(v)
  }

  abstract fun performClick(v: View)
}

Upvotes: 1

Related Questions