2009-07-30 17 views
6

¿Puedo tener más de un método con @Parameters en la clase de prueba junit que se ejecuta con la clase Parameterized?@parameters en Junit 4

@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; 
} 
} 

Respuesta

2

Puede usar el corredor Theories (busque las teorías de palabras en ese enlace) para pasar diferentes parámetros a diferentes métodos.

+0

sí, esta podría ser la solución, gracias, Yishai. – ravinikam

+0

De acuerdo con http://blogs.oracle.com/jacobc/entry/junit_theories, no puede ... – dm76

+0

@ dm76, su enlace parece hacer lo mismo que el que pregunta (varios puntos de datos toman el lugar de múltiples métodos de parámetros), entonces no entiendo tu comentario? – Yishai

2

Probablemente el método data1, pero no hay garantía de que se va a usar en cada uno da la JVM junit4 primero.

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()); 
} 

Así que el primer público, anotada método estático que se encuentra se utilizará, pero puede encontrarlos en cualquier orden.

¿Por qué tiene su prueba escrita de esa manera? Solo debe tener un @Parameters -un método anotado.

+0

Gracias skaffman. En realidad, quería probar dos comportamientos diferentes válidos y uno inválido en la misma clase de prueba con diferentes métodos. – ravinikam

+0

Ah, bien. Si está interesado, puede escribir su propia implementación de Test Runner (copie la fuente de Parameterized y modifíquela para crear la suya) para hacerlo, pero el runter parametrizado incorporado es bastante crudo. – skaffman

+0

hmm, gracias de todos modos. – ravinikam

2

No está diseñado para tener más de un método de datos. Puede verlo en skaffman's answer.

¿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 cajas de prueba? Podrías introducir una pequeña herencia y compartir métodos comunes. Con dos testcases puedes proporcionar dos métodos de datos separados y probar tus cosas muy bien.

Espero que ayude.

+0

que es correcto que se puede lograr fácilmente al separar los casos de prueba. Gracias guerda, por tu respuesta. De hecho, estaba buscando la misma manera que usa TestNG, proporcionando proveedores de datos para cada método. – ravinikam

+0

Un upvote me consolaría;) – guerda

1

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; 
    } 
} 
} 
+0

Esto no funcionó para mí, ninguna de las pruebas se ejecutó. – pts

+0

Tienes que agregar ['@RunWith (Enclosed.class)'] (http://junit.org/junit4/javadoc/latest/org/junit/experimental/runners/Enclosed.html) delante de la clase externa. – sebokopter

Cuestiones relacionadas