2009-04-09 19 views
35

Ho il codice seguente:Perché il mio metodo @BeforeClass non è in esecuzione?

@BeforeClass 
    public static void setUpOnce() throws InterruptedException { 
     fail("LOL"); 
    } 

e vari altri metodi che sono o @Before, @After, @Test o metodi @AfterClass.

Il test non ha esito negativo all'avvio come sembra dovrebbe. Qualcuno può aiutarmi per favore?

ho Junit 4,5

Procedimento sta fallendo in un immediato invito setup() che viene annotato come @before. Classe def è:

public class myTests extends TestCase { 
+0

Puoi confermare che versione di JUnit avete nel vostro classpath? – Peter

+1

Ho JUnit 4.5 nel classpath –

risposta

59

non si estendono TestCase e utilizzare le annotazioni allo stesso tempo !
Se è necessario creare una suite di test con annotazioni, usare l'annotazione RunWith come:

@RunWith(Suite.class) 
@Suite.SuiteClasses({ MyTests.class, OtherTest.class }) 
public class AllTests { 
    // empty 
} 


public class MyTests { // no extends here 
    @BeforeClass 
    public static void setUpOnce() throws InterruptedException { 
     ... 
    @Test 
    ... 

(per convenzione: classe di nomi con lettera maiuscola)

+0

Sì, questa è un'opzione migliore. Non conoscevo queste annotazioni su @Suite e @RunWith. +1 e grazie per i tuoi input. –

+0

grazie. Ho avuto un momento difficile per trovarlo la scorsa settimana .. tipo appena in tempo –

+0

Grazie Carlos, adesso funziona bene. Grazie anche per tutto il tuo aiuto Aceto. –

13

il metodo must be static e non direttamente chiamano falliscono (altrimenti non verranno eseguiti gli altri metodi).

La classe seguente mostra tutti i tipi di metodo JUnit 4 standard:

public class Sample { 

    @BeforeClass 
    public static void beforeClass() { 
     System.out.println("@BeforeClass"); 
    } 

    @Before 
    public void before() { 
     System.out.println("@Before"); 
    } 

    @Test 
    public void test() { 
     System.out.println("@Test"); 
    } 

    @After 
    public void after() { 
     System.out.println("@After"); 
    } 

    @AfterClass 
    public static void afterClass() { 
     System.out.println("@AfterClass"); 
    } 

} 

e l'output è (non sorprendentemente):

@BeforeClass 
@Before 
@Test 
@After 
@AfterClass 
+0

Hai ragione, grazie, ma non ho iniziato a funzionare una volta che sono passato a statico. –

+0

Mostraci la definizione della classe. Potrebbe essere il caso che la tua classe sia una sottoclasse di qualcun altro, e che la classe genitore possa avere qualche metodo annotato come @BeforeClass, e che il metodo della classe genitore finisca con alcuni errori e causi l'interruzione. –

+0

Altrimenti, prova ad aggiungere un normale metodo di prova. –

0

Affinché la funzione prima annotato volontà correre, ho dovuto effettuare le seguenti operazioni: Se si utilizza Maven, aggiungere una dipendenza per Junit 4.11+:

 <properties> 
       <version.java>1.7</version.java> 
       <version.log4j>1.2.13</version.log4j> 
       <version.mockito>1.9.0</version.mockito> 
       <version.power-mockito>1.4.12</version.power-mockito> 
       <version.junit>4.11</version.junit> 
       <version.power-mockito>1.4.12</version.power-mockito> 
     </properties>   

e la dipendenza:

 <dependencies> 
     <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>${version.junit}</version> 
     <scope>test</scope> 
     </dependency>  
     . 
     . 
     . 
     </dependencies> 

Assicurarsi che la classe di test JUnit non è estendendo la classe TestCase, dal momento che questo farà sì che si sovrappongono con una versione precedente:

public class TuxedoExceptionMapperTest{ 
    protected TuxedoExceptionMapper subject; 

    @Before 
    public void before() throws Exception { 
    subject = TuxedoExceptionMapper.getInstance(); 
     System.out.println("Start"); 
     MockitoAnnotations.initMocks(this); 
    } 
} 
1

Assicurarsi che:

  • tua classe di test doesn eredita da TestCase
  • Il metodo @BeforeClass è statico
  • Si esegue Non avere più di un metodo di @BeforeClass nella gerarchia di classe di test (solo verrà eseguito il metodo @BeforeClass più specializzata)
+0

Esecuzione jUnit 4.11 consente più di un @BeforeClass, uno nella classe e uno in una super classe, e chiama entrambi. – fishjd

Problemi correlati