2009-07-30 10 views
6

Posso avere più di un metodo con parametri @ in classe di test JUnit, che è in esecuzione con classe parametrica?parametri @ in 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; 
} 
} 

risposta

2

È possibile utilizzare il Theories corridore (ricerca per la parola teorie in quel link) per passare parametri diversi per metodi diversi.

+0

sì, questa potrebbe essere la soluzione, grazie Yishai. – ravinikam

+0

Secondo http://blogs.oracle.com/jacobc/entry/junit_theories, non è possibile ... – dm76

+0

@ dm76, il tuo link sembra di fare ciò che l'interrogante ha chiesto pure (più punti dati prendere il posto di molteplici metodi di parametri), quindi non sto capendo il tuo commento? – Yishai

2

Probabilmente il metodo data1, ma nessuna garanzia di che, sarà utilizzare a seconda di quale una JVM dà prima Junit4.

Ecco il codice di cui 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()); 
} 

Quindi verrà utilizzato il primo pubblico, metodo annotato statica che trova, ma li può trovare in qualsiasi ordine.

Perché il tuo test è stato scritto in questo modo? Si dovrebbe avere un solo metodo @Parameters -annotato.

+0

Grazie skaffman. In realtà volevo testare due comportamenti diversi validi uno e uno non valido nella stessa classe di test con metodi diversi. – ravinikam

+0

Ah OK. Se sei appassionato, allora potresti scrivere la tua implementazione del Runner di test (copia il sorgente per il Parameterized e modificarlo per renderlo tuo), ma il runner parametrizzato incorporato è piuttosto grezzo. – skaffman

+0

hmm, grazie comunque. – ravinikam

2

Non è designato per avere più di un metodo di dati. Puoi vederlo in skaffman's answer.

perché non è fornito per implementare due metodi di dati?
La risposta potrebbe essere: Accoppiamento.

È troppo complesso suddividere questo test in due testicoli? Sareste in grado di introdurre una piccola ereditarietà e condividere metodi comuni. Con due testicoli è possibile fornire due metodi di dati separati e testare le tue cose molto bene.

Spero che aiuti.

+0

che è giusto che possa essere facilmente ottenuta utilizzando per separare i casi di test. Grazie, guerda, per la tua risposta. In realtà stavo cercando lo stesso modo che utilizza TestNG, fornendo provider di dati per ciascun metodo. – ravinikam

+0

Un'invitabile mi conforterebbe;) – guerda

1

È possibile creare classi interne per ciascun insieme di metodi che operano sugli stessi parametri. Ad esempio:

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

Questo non ha funzionato per me, nessuno dei test è stato eseguito. – pts

+0

Devi aggiungere ['@RunWith (Enclosed.class)'] (http://junit.org/junit4/javadoc/latest/org/junit/experimental/runners/Enclosed.html) di fronte alla classe esterna. – sebokopter