gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 07:41:57 25 4
gpt4 key购买 nike

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

我已经找到了这个 question在 SO 上有很好的解决方案,但它们仅适用于 Java,正如我遵循的一些答案中所建议的那样 this tutorial , 但简单地将其转换为 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[][]{
{"mary@testdomain.com", true},
{"mary.smith@testdomain.com", true},
{"mary_smith123@testdomain.com", 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 参数化单元测试的正确方法是什么?

最佳答案

正在关注 this amazing tutorial,我们可以这样用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("mary@testdomain.com", true),
arrayOf("mary.smith@testdomain.com", true),
arrayOf("mary_smith123@testdomain.com", true),
arrayOf("mary@testdomaindotcom", false),
arrayOf("mary-smith@testdomain", false),
arrayOf("testdomain.com", false)
).toList()
}
}
}

Remember to add @JvmStatic in the data() method, otherwise you will get the error: java.lang.Exception: No public static parameters method on class com.example.testapp.dev.EmailIdValidatorTest


更简单的方法

如果你可以使用另一个库(也可以在 Android 中工作),我建议你添加 JUnitParams对于您的测试依赖项,在 Android 中它可能是:

testImplementation  "pl.pragmatists:JUnitParams:1.1.1"

然后你可以这样转换上面的类:

@RunWith(JUnitParamsRunner::class)
class EmailIdValidatorTest {

@Test
@Parameters(value = [
"mary@testdomain.com, true",
"mary.smith@testdomain.com, true",
"mary_smith123@testdomain.com, 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 的更多示例,您可以查看链接。

With JUnit 5 this is a lot easier but currently JUnit 5 is not supported for Android tests if you don't use Android-JUnit 5 too.

关于android - 如何在 JUnit 4 和 Kotlin for Android 中创建参数化测试用例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55259591/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com