@parameters no JUnit4
-
05-07-2019 - |
Pergunta
Posso ter mais de um método com @Parameters na classe de teste JUnit que está sendo executado com classe parametrizada?
@RunWith(value = Parameterized.class)
public class JunitTest6 {
private String str;
public JunitTest6(String region, String coverageKind,
String majorClass, Integer vehicleAge, BigDecimal factor) {
this.str = region;
}
@Parameters
public static Collection<Object[]> data1() {
Object[][] data = {{some data}}
return Arrays.asList(data);
}
@Test
public void pushTest() {
System.out.println("Parameterized str is : " + str);
str = null;
}
@Parameters
public static Collection<Object[]> data() {
Object[][] data = {{some other data}}
return Arrays.asList(data);
}
@Test
public void pullTest() {
System.out.println("Parameterized new str is : " + str);
str = null;
}
}
Solução
Você pode usar o Teorias corredor (procurar as teorias palavra de que possuem links) para passar parâmetros diferentes para diferentes métodos.
Outras dicas
Provavelmente o método data1
, mas não há garantia de que, ele vai usar qualquer um do JVM dá junit4 primeiro.
Aqui está o código relevante do junit:
private FrameworkMethod getParametersMethod(TestClass testClass) throws Exception {
List<FrameworkMethod> methods= testClass.getAnnotatedMethods(Parameters.class);
for (FrameworkMethod each : methods) {
int modifiers= each.getMethod().getModifiers();
if (Modifier.isStatic(modifiers) && Modifier.isPublic(modifiers))
return each;
}
throw new Exception("No public static parameters method on class " + testClass.getName());
}
Assim, a primeira pública, estático método anotado que encontrar será usado, mas pode encontrá-los em qualquer ordem.
Por que você tem uour teste escrito dessa maneira? Você deve ter apenas um método anotado-@Parameters
.
Não é designado para ter mais de um método de dados. Você pode vê-lo em resposta .
Por que não é fornecido para implementar métodos de dois dados?
A resposta poderia ser:. Coupling
É muito complexo para dividir este teste em dois casos de teste? Você seria capaz de introduzir uma pequena herança e compartilhar métodos comuns. Com dois testcases você poderia fornecer dois métodos de dados separados e testar suas coisas muito bem.
Espero que ajude.
Você pode criar classes internas para cada conjunto de métodos que operam sobre os mesmos parâmetros. Por exemplo:
public class JunitTest6 {
@RunWith(value = Parameterized.class)
public static class PushTest{
private String str;
public PushTest(String region) {
this.str = region;
}
@Parameters
public static Collection<Object[]> data() {
Object[][] data = {{some data}}
return Arrays.asList(data);
}
@Test
public void pushTest() {
System.out.println("Parameterized str is : " + str);
str = null;
}
}
@RunWith(value = Parameterized.class)
public static class PullTest{
private String str;
public PullTest(String region) {
this.str = region;
}
@Parameters
public static Collection<Object[]> data() {
Object[][] data = {{some other data}}
return Arrays.asList(data);
}
@Test
public void pullTest() {
System.out.println("Parameterized new str is : " + str);
str = null;
}
}
}