Reputation: 283
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
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