2009-04-09 30 views
35

Tengo el siguiente código:¿Por qué no se ejecuta mi método @BeforeClass?

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

y varios otros métodos que son bien @Before, @After, @test o métodos @AfterClass.

La prueba no falla al iniciarse, ya que parece que debería. ¿Puede alguien ayudarme por favor?

He Junit 4,5

El método no está cumpliendo con una llamada inmediata a setup() que está anotado como @before. def clase es:

public class myTests extends TestCase { 
+0

¿Puede confirmar qué versión de junit tiene en su classpath? – Peter

+1

Tengo JUnit 4.5 en classpath –

Respuesta

59

no se extienden TestCase y utilizar anotaciones al mismo tiempo !
Si necesita crear un banco de pruebas con anotaciones, utilice la anotación RunWith como:

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

(por convención: Clase de nombres con letra mayúscula)

+0

Sí, esta es una mejor opción. No sabía acerca de estas anotaciones @Suite y @RunWith. +1 y gracias por tus entradas. –

+0

gracias. Tuve un momento difícil para encontrarlo la semana pasada ... algo así como a tiempo –

+0

Gracias Carlos, funciona bien ahora. También gracias por toda su ayuda, vinagre. –

13

el método must be static y no llamar directamente fallan (de lo contrario no se ejecutarán los otros métodos).

la clase siguiente muestra todos los estándar tipos de métodos 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"); 
    } 

} 

y que la salida es (no sorprendentemente):

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

Tiene razón, gracias, pero no comenzó a funcionar una vez que cambié a estática. –

+0

Muéstranos la definición de clase. Puede ser que su clase sea una subclase de otra persona, y esa clase padre puede tener algún método anotado como @BeforeClass, y ese método de la clase padre termina con algunos errores y provoca la interrupción. –

+0

De lo contrario, intente agregar un método de prueba normal. –

0

Con el fin de que la función antes anotado correr, tenía que hacer lo siguiente: Si utiliza Maven, agregar una dependencia a 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>   

y la dependencia:

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

Asegúrese de que su clase de prueba Junit no está extendiendo la clase TestCase, ya que esto hará que se solapan con una versión anterior:

public class TuxedoExceptionMapperTest{ 
    protected TuxedoExceptionMapper subject; 

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

Asegúrese de que:

  • su clase de prueba doesn 't hereda de TestCase
  • El método @BeforeClass es estático
  • Lo haces no tiene más de un método @BeforeClass en la jerarquía de clases de prueba (solo se ejecutará el método más especializado de @BeforeClass)
+0

La ejecución de jUnit 4.11 permite más de una @BeforeClass, una en su clase y otra en una superclase, y las llama a ambas. – fishjd

Cuestiones relacionadas