如何在Android的JUnit 4和Kotlin中创建参数化的测试用例?

MatPag

我需要与具有固定预期结果的C#NUnit TestCase场景类似的东西

我已经在SO上找到了这个问题,它具有很好的解决方案,但它们仅适用于Java,并且正如我按照本教程进行的一些回答中所建议的那样,但是仅将其转换为Kotlin是行不通的。

@RunWith(value = Parameterized.class)
public class EmailIdValidatorTest {

    private String emailId;
    private boolean expected;

    public EmailIdValidatorTest(String emailId, boolean expected) {
        this.emailId = emailId;
        this.expected = expected;
    }
    @Parameterized.Parameters(name= "{index}: isValid({0})={1}")
    public static Iterable<Object[]> data() {
        return Arrays.asList(new Object[][]{
                        {"[email protected]", true},
                        {"[email protected]", true},
                        {"[email protected]", true},
                        {"mary@testdomaindotcom", false},
                        {"mary-smith@testdomain", false},
                        {"testdomain.com", false}
                }
        );
    }
    @Test
    public void testIsValidEmailId() throws Exception {
        boolean actual= EmailIdUtility.isValid(emailId);
        assertThat(actual, is(equalTo(expected)));
    }
}

那么用JUnit编写Kotlin参数化单元测试的正确方法是什么?

MatPag

遵循了这个惊人的教程,我们可以用Kotlin语言来实现它:

首先将EmailIdUtility类转换为Kotlin:

object EmailIdUtility {
    fun isValid(email: String): Boolean {
        val regex =
            "^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$"
        val pattern = Pattern.compile(regex)
        val m = pattern.matcher(email)
        return m.matches()
    }
}

然后将其转换EmailIdValidatorTest为Kotlin

@RunWith(value = Parameterized::class)
class EmailIdValidatorTest(
    private val email: String,
    private val expected: Boolean)
{
    @Test
    fun testIsValidEmailId() {
        val actual = EmailIdUtility.isValid(email)
        assertEquals(expected, actual)
    }

    companion object {
        @JvmStatic
        @Parameterized.Parameters(name = "{index}: isValid({0})={1}")
        fun data(): Iterable<Array<Any>> {
            return arrayListOf(
                arrayOf("[email protected]", true),
                arrayOf("[email protected]", true),
                arrayOf("[email protected]", true),
                arrayOf("mary@testdomaindotcom", false),
                arrayOf("mary-smith@testdomain", false),
                arrayOf("testdomain.com", false)
            ).toList()
        }
    }
}

记住要添加@JvmStaticdata()方法,否则会出现错误:java.lang.Exception:com.example.testapp.dev.EmailIdValidatorTest类上没有公共静态参数方法


快捷方式

如果可以使用另一个库(也可以在Android中使用),建议您将JUnitParams添加到测试依赖项中,在Android中,它可能是:

testImplementation  "pl.pragmatists:JUnitParams:1.1.1"

然后,您可以按以下方式转换上面的类:

@RunWith(JUnitParamsRunner::class)
class EmailIdValidatorTest {

    @Test
    @Parameters(value = [
        "[email protected], true",
        "[email protected], true",
        "[email protected], true",
        "mary@testdomaindotcom, false",
        "mary-smith@testdomain, false",
        "testdomain.com, false"
    ])
    fun testIsValidEmailId(email: String, expected: Boolean) {
        val actual = EmailIdUtility.isValid(email)
        assertEquals(expected, actual)
    }
}

对我来说,这比JUnit方法容易得多

有关如何使用JUnitParams的更多示例,可以检查链接。

使用JUnit 5,这要容易得多,但是如果您也不使用Android-JUnit 5,那么当前的Android测试不支持JUnit 5

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何执行参数化Junit测试用例

如何在Junit测试用例中捕获被包裹的异常?

如何在springboot中编写JUnit测试用例

JUnit如何在Android中测试模型?

如何在运行时在JUnit 4中获取测试用例名称?

将参数从测试套件发送到junit 4中的测试用例

JUnit 3.x中的参数化测试用例类

Spring MVC 4控制器的Junit测试用例,以检查@RequestMapping中的@PathVariable参数

如何在JIRA中记录和运行测试用例?

如何在Android Kotlin中编写开关条件的测试用例

在JUnit4和Mockito中编写SQLiteOpenHelper测试用例

无法在JUnit中实例化测试用例

如何编写JUnit测试用例以测试线程和事件

如何在JUnit测试用例中比较文件?

如何将多个参数传递给 CumulusCI 测试自动化框架中的测试用例?

如何在Android Studio中运行普通的旧JUnit测试

如何在单元测试用例(grails,junit)中声明“ render”中的值

如何在gradle 2.x中运行单个测试用例(使用JUnit)?

如何在Java程序中运行外部测试用例(类,junit)?

如何在vert.x中为用户Verticle的启动方法编写Junit测试用例?

如何在Play框架2.3.2中运行JUnit测试用例

Python测试如何运行参数化的测试用例并将参数传递给setupClass

如何忽略Android中的测试用例?

Android Junit测试用例中的字节码注入

在Eclipse中,如何多次运行JUnit测试用例

如何在JUnit 4中动态创建测试套件?

如何在 JUnit 5 的参数化测试中通过预期值和实际值

如何在Eclipse中的py.test中运行特定的参数测试用例

如何在单个python脚本中设置测试数据和测试用例