2015-10-29 14 views
10

Attualmente ho una classe astratta BaseTest che contiene diversi generici @Test.Suite a più livelli parametrizzate

public abstract class BaseTest { 

    private String expected; 
    private String actual; 

    public BaseTest(String expected, String actual) { 
     this.expected = expected; 
     this.actual = actual; 
    } 

    public String methodToTest(String line) { 
     return line.trim(); 
    } 

    @Test 
    public void testNull() { 
     assertNull(methodToTest(null)); 
    } 

    // more @Tests... 
} 

SomeTest estende BaseTest, dove definisco vari casi di test.

@RunWith(Parallelized.class) 
public class SomeTest extends BaseTest { 
    // @Parameters (test cases) goes here... 
} 

Ho molte prove che si estende BaseTest, che poi messo in un Suite in RunAllTests.

@RunWith(Suite.class) 
@SuiteClasses({ SomeTest.class, AnotherTest.class, etc... }) 
public class RunAllTests { } 

Quindi diciamo che voglio aggiungere più @Test 's, tuttavia voglio contenerli in una classe diversa.

public class WhitespaceTest extends BaseTest { 

    public WhitespaceTest(String expected, String actual) { 
     super(expected, actual); 
    } 

    @Test 
    public void testNewline() { 
     assertEquals(expected, methodToTest(actual + "\n")); 
    } 

    // more @Tests... 
} 

Risulta ho bisogno di un altro "strato" di Suites per eseguire ogni singola prova, in modo che per ogni classe in RunAllTests, corro il BaseTestEWhitespaceTest. Come posso implementare questo livello?

+0

Non capisco. Perché non puoi semplicemente aggiungere 'WhitespaceTest' alla tua attuale suite? Ovviamente hai più suite – dkatzel

+0

Voglio eseguire ogni test in 'WhitespaceTest' per ogni' BaseTest' nella suite corrente. –

+0

Sembra più un problema di ereditarietà che un problema di suite – dkatzel

risposta

1

Ecco il mio attuale (ingenuo) soluzione a questo problema:

Entro BaseTest:

@Test 
public void testNewline() { 
    WhitespaceTest wt = new WhitespaceTest(expected, actual); 
    wt.testNewline(); 
} 

Questo funziona, ma c'è un sacco di codice duplicato. Per ogni @Test in WhitespaceTest, è necessario creare un altro @Test in BaseTest.

+0

Penso che non possa funzionare: si esegue il BaseTest con una serie di parametri (previsti, effettivi). Il test di Whitespace consentirà un altro set di parametri rispetto al test del comportamento Null. Forse questo indica un fallimento della progettazione della tua classe BaseTest (si limita a scartare l'attesa/l'effettiva). – CoronA

+0

Funziona, è solo un livello di indecisione che non voglio. Ma sì, al momento sto ridisegnando il mio intero modulo di test su ciò che avevi consigliato all'inizio della settimana. –