我需要与具有固定预期结果的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参数化单元测试的正确方法是什么?
遵循了这个惊人的教程,我们可以用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()
}
}
}
记住要添加
@JvmStatic
该data()
方法,否则会出现错误: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] 删除。
我来说两句