如何在android中模拟单元测试的视图

时间:2021-04-06 12:30:57

标签: android kotlin

我有一个助手类,用于在我的应用程序中进行 TextInputEditText 字段验证。它接受具有不同标签的 TextInputEditText 数组。首先它筛选任何空的人,然后根据他们的不同标签继续验证他们。 我希望能够测试类并传递带有标签的 TextInputEditText 数组作为参数,但发现很难模拟 TextInputEditText。

class Validation private constructor(
    var respond:TextInputEditText,
    vararg edits: TextInputEditText
) {

    class Builder(
        var email: TextInputEditText? = null,
        var password: TextInputEditText? = null,
        var phoneNumber: TextInputEditText? = null,
        var respond:TextInputEditText?=null,
        vararg var edits: TextInputEditText

    ) {

        fun getEmptyField(edits: Array<out TextInputEditText>): Builder = apply {
            this.edits = edits
            for (edit in edits) {
                when {
                    edit.text?.isEmpty() == true -> {
                        edit.error = "${edit.tag} is required"
                        this.respond = edit
                        return@apply
                    }
                    edit.tag.toString().contains("email", true) -> {
                        this.email = edit
                    }
                    edit.tag.toString().contains("password", true) -> {
                        this.password = edit
                    }
                    edit.tag.toString().contains("phone", true) -> {
                        this.phoneNumber = edit
                    }
                }

            }
        }
        fun email() = apply {
            val emailPattern = Regex("""^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*${'$'}""")
            val matchedEmail = emailPattern.matches(this.email?.text.toString())
            if(matchedEmail){
                return@apply
            }
            else{
                this.respond = email
                this.respond?.error = "Invalid"
                return@apply
            }
        }
        fun password() = apply {
            val passwordPattern = Regex("""^[a-zA-Z0-9@$!.%*#?&]{6,}$""")
            val matchedPassword = passwordPattern.matches(this.password?.text.toString())
            if(matchedPassword){
                return@apply
            }
            else{
                this.respond = password
                this.respond?.error = "Invalid"
                return@apply
            }
        }
        fun phone() = apply {
            val phonePattern = Regex("""^(80|70|90|81)([12356709])\d{7}$""")
            val matchedPhone = phonePattern.matches(this.phoneNumber.toString())
            if(matchedPhone){
                return@apply
            }
            else{
                this.respond = phoneNumber
                this.respond?.error = "Invalid"
                return@apply
            }

        }
        fun build():Validation? {
            val listOfDefaulters = arrayListOf<TextInputEditText>()
            for (edit in this.edits){
                if (edit.error != null){
                    listOfDefaulters.add(edit)
                    this.respond = listOfDefaulters[0]
                    this.respond!!.error = "Invalid"
                }
            }
           return respond?.let { Validation(it, *edits) }
        }
    }

}

我如何测试这个类并通过存根。

1 个答案:

答案 0 :(得分:0)

我终于找到了解决方法。这可能会帮助其他人。您可以在下面找到代码。

基本上我所做的是传入一对自定义类来模拟编辑文本和相应的可选编辑文本。这样我就可以只用自定义类来测试这个类了。

/**
 * @author Abdulrasaq Durosomo
 * @param respond
 * @param edits
 */
class Validation private constructor(
    var respond: Pair<CustomEditTextField, TextInputEditText?>,
    vararg var edits: Pair<CustomEditTextField, TextInputEditText?>
) {

    class Builder(
        var emailPair: Pair<CustomEditTextField, TextInputEditText?>? = null,
        var passwordPair: Pair<CustomEditTextField, TextInputEditText?>? = null,
        var phoneNumberPair: Pair<CustomEditTextField, TextInputEditText?>? = null,
        var respond: Pair<CustomEditTextField, TextInputEditText?>? = null,
        vararg var fieldPairList: Pair<CustomEditTextField, TextInputEditText?>

    ) {

        /**
         * @param edits
         * This separates field based on their tag and also rejects empty field
         */
        fun separateFieldByTag(edits: List<Pair<CustomEditTextField, TextInputEditText?>>): Builder = apply {
            this.fieldPairList = edits.toTypedArray()
            for (edit in edits) {
                when {
                    edit.first.text.isEmpty() -> {
                        edit.first.error = "${edit.first.tag} is required"
                        edit.second?.error = "${edit.first.tag} is required"
                        this.respond = edit
                        return@apply
                    }
                    edit.first.tag.toString().contains("email", true) -> {
                        this.emailPair = edit
                    }
                    edit.first.tag.toString().contains("password", true) -> {
                        this.passwordPair = edit
                    }
                    edit.first.tag.toString().contains("phone", true) -> {
                        this.phoneNumberPair = edit
                    }
                }
            }
        }

        /**
         * Validate email address
         */
        fun email() = apply {
            val emailPattern = Regex("""^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*${'$'}""")
            val matchedEmail = emailPattern.matches(this.emailPair?.first?.text.toString())
            if (matchedEmail) {
                return@apply
            } else {
                this.respond = emailPair
                this.respond?.first?.error = "Invalid"
                this.respond?.second?.error = "Invalid"
                return@apply
            }
        }

        /**
         * Validate password
         */
        fun password() = apply {
            val passwordPattern = Regex("""^[a-zA-Z0-9@$!.%*#?&]{6,15}$""")
            val matchedPassword = passwordPattern.matches(this.passwordPair?.first?.text.toString())
            if (matchedPassword) {
                return@apply
            } else {
                this.respond = passwordPair
                this.respond?.first?.error = "Invalid"
                this.respond?.second?.error = "Invalid"
                return@apply
            }
        }

        /**
         * Validate phone number
         */
        fun phone() = apply {
            val phonePattern = Regex("""^(80|70|90|81)([12356709])\d{7}$""")
            val matchedPhone = phonePattern.matches(this.phoneNumberPair?.first?.text.toString())
            if (matchedPhone) {
                return@apply
            } else {
                this.respond = phoneNumberPair
                this.respond?.first?.error = "Invalid"
                this.respond?.second?.error = "Invalid"
                return@apply
            }
        }

        /**
         * Build validation
         */
        fun build(): Validation? {
            val listOfDefaulters = arrayListOf<Pair<CustomEditTextField, TextInputEditText?>?>()
            for (edit in this.fieldPairList) {
                if (edit.first.error != "") {
                    listOfDefaulters.add(edit)
                    this.respond = listOfDefaulters[0]
                    this.respond!!.second?.error = "Invalid"
                }
            }
            return respond?.let { Validation(it, *fieldPairList) }
        }
    }
}