如何使用Robolectric触发TextEdit的丢失焦点事件?

时间:2018-04-17 01:19:41

标签: android testing kotlin robolectric

我在屏幕上有2个TextEdits。它们都有OnFocusChangeListener,它会检查字段中的文本,如果它为空,则会将error属性设置为错误消息。它根据我的临时测试工作。

但我不知道如何使用Robolectric验证这一点?我试过这个:

@RunWith(RobolectricTestRunner::class)
class AuthLogDetailActivityUITest {
    @Test
    fun should_show_error_when_no_text_input_when_textInput_lost_focus() {
        val logDetailsActivity = Robolectric.setupActivity(AuthLogDetailsActivity::class.java)

        val quickNameTextEdit = logDetailsActivity.findViewById<TextInputEditText>(R.id.loginDetails_textEdit_quickName)
        val passwordTextEdit = logDetailsActivity.findViewById<TextInputEditText>(R.id.loginDetails_textEdit_password)

        quickNameTextEdit.performClick()
        passwordTextEdit.performClick()

        assertNotNull(quickNameTextEdit.error)
    }
}

我试图模仿现实世界,用户只需逐个点击文本编辑而不输入任何内容。

但在现实世界中,只要用户点击passwordTextEditquickNameTextEdit就会显示错误消息。

但是测试将始终失败,因为quickNameTextEdit.error为空。

我认为这不是触发onFocusChange事件的方法。测试此行为的Robolectric方式是什么?

1 个答案:

答案 0 :(得分:1)

我可以使用OnFocusChangeListener来触发.performAccessibilityAction(ACTION_FOCUS, Bundle())。希望这可以解决您的问题。您的示例如下所示:

@RunWith(RobolectricTestRunner::class)
class AuthLogDetailActivityUITest {
    @Test
    fun should_show_error_when_no_text_input_when_textInput_lost_focus() {
        val logDetailsActivity = Robolectric.setupActivity(AuthLogDetailsActivity::class.java)

        val quickNameTextEdit = logDetailsActivity.findViewById<TextInputEditText>(R.id.loginDetails_textEdit_quickName)
        val passwordTextEdit = logDetailsActivity.findViewById<TextInputEditText>(R.id.loginDetails_textEdit_password)

        quickNameTextEdit.performAccessibilityAction(ACTION_FOCUS, Bundle())
        passwordTextEdit.performAccessibilityAction(ACTION_FOCUS, Bundle())

        assertNotNull(quickNameTextEdit.error)
    }
}