web-dev-qa-db-fra.com

Pourquoi ma méthode @BeforeClass n'est-elle pas en cours d'exécution?

J'ai le code suivant:

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

Et diverses autres méthodes, à savoir les méthodes @Avant, @After, @Test ou @AfterClass.

Le test n'échoue pas au démarrage car il semble que ce devrait être le cas. Quelqu'un peut m'aider s'il vous plaît?

J'ai JUnit 4.5

La méthode échoue dans un appel immédiat à setUp () annoté avec @before. La classe def est:

public class myTests extends TestCase {
38
Lynden Shields

nE PAS étendre TestCase ET utiliser des annotations en même temps!
Si vous devez créer une suite de tests avec des annotations, utilisez l'annotation RunWith comme suit:

@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: noms de classe avec lettre majuscule)

64
Carlos Heuberger

la méthode doit être statique et ne pas directement appeler fail (sinon les autres méthodes ne seront pas exécutées).

La classe suivante affiche tous les types de méthode 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");
    }

}

et la sortie est (sans surprise):

@BeforeClass
@Before
@Test
@After
@AfterClass
15
Vladimir

Sois sûr que :

  • Votre classe de test n'hérite pas de TestCase
  • La méthode @BeforeClass est statique
  • Vous n'avez pas 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)
2
ben75

Pour que la fonction annotée précédente soit exécutée, je devais procéder comme 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 classe Junit Test n'étend pas la classe TestCase, car cela entraînerait un chevauchement avec l'ancienne version:

public class TuxedoExceptionMapperTest{
   protected TuxedoExceptionMapper subject;

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