2009-04-09 10 views
35

J'ai le code suivant:Pourquoi ma méthode @BeforeClass n'est-elle pas en cours d'exécution?

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

et diverses autres méthodes qui sont soit @Before, @After, @Test ou méthodes de @AfterClass.

Le test n'échoue pas au démarrage, comme cela semble être le cas. Quelqu'un peut-il m'aider s'il vous plaît?

je JUNIT 4,5

Le procédé ne parvient pas à un appel immédiat à setUp() qui est annoté comme @Before. def classe est:

public class myTests extends TestCase { 
+0

Pouvez-vous confirmer la version de junit que vous avez dans votre classpath? – Peter

+1

J'ai JUnit 4.5 dans classpath –

Répondre

59

ne se prolongent pas TestCase et utiliser les annotations en même temps !
Si vous avez besoin pour créer une suite de test avec annotations, utilisez l'annotation RunWith comme:

@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 
    ... 

(par convention: Les noms de classe avec lettre majuscule)

+0

Oui, c'est une meilleure option. Je ne connaissais pas ces annotations @Suite et @RunWith. +1 et merci pour vos contributions. –

+0

merci. J'ai eu du mal à le trouver la semaine dernière .. un peu juste à temps –

+0

Merci Carlos, fonctionne bien maintenant. Merci aussi pour toute votre aide au vinaigre. –

13

la méthode must be static et non appeler directement échouent (sinon les autres méthodes ne seront pas exécutées).

La classe suivante montre tous les types standard de méthode JUnit 4:

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

} 

et ouput est (sans surprise):

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

Vous avez raison, merci, mais n'a pas commencé à travailler une fois que je suis passé en statique. –

+0

Montrez-nous la définition de la classe. Il se peut que votre classe soit une sous-classe d'une autre personne, et cette classe parent peut avoir une méthode annotée comme @BeforeClass, et cette méthode de la classe parent se termine avec quelques erreurs et provoque l'arrêt. –

+0

Sinon, essayez d'ajouter une méthode de test normale. –

0

Pour que la fonction avant annoté courir, je devais faire ce qui suit: Si vous utilisez Maven, ajoutez une dépendance à 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>   

et la dépendance:

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

Assurez-vous que votre Junit classe de test ne prolonge pas la classe TestCase, car cela entraînera chevauchement avec la version Older:

public class TuxedoExceptionMapperTest{ 
    protected TuxedoExceptionMapper subject; 

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

Assurez-vous que:

  • Votre classe de test doesn 't hérite de TestCase
  • La méthode @BeforeClass est statique
  • Vous faites ne pas avoir plus d'une méthode @BeforeClass dans la hiérarchie des classes de test (seule la méthode @BeforeClass la plus spécialisée sera exécutée)
+0

L'exécution de jUnit 4.11 permet plus d'un @BeforeClass, un dans votre classe et un dans une super classe, et appelle les deux. – fishjd

Questions connexes