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;
 }
}
¿Fue útil?

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;
  }
 }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top