@parameters en Junit 4
-
05-07-2019 - |
Pregunta
¿Puedo tener más de un método con @Parameters en la clase de prueba junit que se ejecuta con la clase 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;
}
}
Solución
Puede usar el Theories (busque la palabra teorías en ese enlace) para pasar diferentes parámetros a diferentes métodos.
Otros consejos
Probablemente el método data1
, pero no hay garantía de ello, utilizará el primero que JVM le dé a junit4.
Aquí está el código relevante de 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());
}
Por lo tanto, se utilizará el primer método público y estático anotado que encuentre, pero puede encontrarlo en cualquier orden.
¿Por qué tienes tu prueba escrita de esa manera? Solo debe tener un método @Parameters
-annotated.
No está designado para tener más de un método de datos. Puede verlo en respuesta de Skaffman .
¿Por qué no se proporciona para implementar dos métodos de datos?
La respuesta podría ser: Acoplamiento.
¿Es demasiado complejo dividir esta prueba en dos testcases? Podrías introducir una pequeña herencia y compartir métodos comunes. Con dos cajas de prueba, podría proporcionar dos métodos de datos separados y probar sus cosas muy bien.
Espero que ayude.
Puede crear clases internas para cada conjunto de métodos que operan en los mismos parámetros. Por ejemplo:
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;
}
}
}