如何解决JUnit参数化测试失败
我刚开始使用JUnit(之前阅读过一些文章)并遇到了问题。我有一个参数化测试类:
char
我将收到以下异常:
@RunWith(value = Parameterized.class)
public class ConnectionTest {
private Connection connection;
@Parameterized.Parameter
public String url;
@Parameterized.Parameters()
public static Collection<Object[]> urls() {
return List.of(new Object[][]{
{"https://www.google.com/"},{"..."},});
}
@Parameterized.Parameter
public String invalidUrl;
@Parameterized.Parameter
public String language;
@Parameterized.Parameter
public String country;
public static Collection<Object[]> invalidUrls() {
return List.of(new Object[][]{
{"https://www.google.com/,"en","US"},{...},{...}
});
}
@Before
public void createConnection() {
connection = new Connection();
}
@Test
public void urlShouldBeLocalizedWithRequiredLanguage() throws MalformedURLException,URISyntaxException {
Map<String,String> params = connection.getParameters(url);
Assert.assertTrue(connection.getLocalized(params,"ru","RU").toString().endsWith("&hl=en&gl=US"));
}
@Test
public void parameterIdShouldNotBeEmpty() throws MalformedURLException {
Assert.assertFalse(connection.getParameters(url).get("id").isEmpty());
}
@Test(expected = InvalidGooglePlayGameUrlException.class)
public void notValidUrlShouldThrowException() throws InvalidUrlException,URISyntaxException,MalformedURLException {
connection.connect(invalidUrl,language,country);
}
}
和
@Parameter(0) is used more than once (4).
java.lang.Exception: @Parameter(0) is used more than once (4).
at org.junit.runners.parameterized.BlockJUnit4ClassRunnerWithParameters.validateFields(BlockJUnit4ClassRunnerWithParameters.java:119)
...
....
还有一些用于参数(2,3)。
摘要:4个测试,全部失败。甚至没有适当数量的测试。
还是我应该离开参数化测试并继续:
@Parameter(1) is never used.
java.lang.Exception: @Parameter(1) is never used.
最后一个变体工作正常,但是参数化大小写呢?我真的不想在每种方法中都使用循环。
解决方法
您需要将此测试分为两个参数化测试。
据我所知,只能有一个数据列表-只有一个@Parameterized.Parameters
一个用于标准网址,一个用于无效网址。
在无效测试中,您需要将invalidUrls()
标记为@Parameterized.Parameters
此外,您必须将索引添加到@Parameterized.Parameter
例如在{"https://www.google.com/,"en","US"},
,您有3个参数。
因此必须使用
@Parameterized.Parameter(0) // zero is default and not required
public String invalidUrl;
@Parameterized.Parameter(1)
public String language;
@Parameterized.Parameter(2)
public String country;
,
您可以使用Enclosed runner构建测试。
@RunWith(Enclosed.class)
public class TestClass {
@RunWith(Parameterized.class)
public static class ValidUrls {
@Parameterized.Parameters()
public static Collection<Object> urls() {
return List.of(
"https://www.google.com/","...","..."
);
}
@Parameterized.Parameter
public String url;
private Connection connection;
@Before
public void createConnection() {
connection = new Connection();
}
@Test
public void urlShouldBeLocalizedWithRequiredLanguage() throws Exception {
Map<String,String> params = connection.getParameters(url);
Assert.assertTrue(connection.getLocalized(params,"ru","RU").toString().endsWith("&hl=en&gl=US"));
}
@Test
public void parameterIdShouldNotBeEmpty() throws Exception {
Assert.assertFalse(connection.getParameters(url).get("id").isEmpty());
}
}
public static class InvalidUrls {
@Parameterized.Parameters()
public static Object[][] invalidUrls() {
return new Object[][]{
new Object[] {"https://www.google.com/,new Object[] {...},new Object[] {...}
});
}
@Parameterized.Parameter(0)
public String invalidUrl;
@Parameterized.Parameter(1)
public String language;
@Parameterized.Parameter(2)
public String country;
private Connection connection;
@Before
public void createConnection() {
connection = new Connection();
}
@Test(expected = InvalidGooglePlayGameUrlException.class)
public void notValidUrlShouldThrowException() throws Exception {
connection.connect(invalidUrl,language,country);
}
}
}
有关更多选项,请查看"Excluding a non param test in parameterized test class"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。