He encontrado el uso correcto (o al menos la documentación) de JUnit muy confuso. Esta pregunta sirve como una referencia futura y como una pregunta real.Confusión de JUnit: use 'extends TestCase' o '@Test'?
Si he entendido bien, hay dos enfoques principales para crear y ejecutar una prueba JUnit:
Enfoque A (JUnit 3-estilo): crear una clase que se extiende TestCase, y empezar a métodos de prueba con la palabra test
. Al ejecutar la clase como una Prueba JUnit (en Eclipse), todos los métodos que comienzan con la palabra test
se ejecutan automáticamente.
import junit.framework.TestCase;
public class DummyTestA extends TestCase {
public void testSum() {
int a = 5;
int b = 10;
int result = a + b;
assertEquals(15, result);
}
}
Enfoque B (JUnit 4-estilo): crear una clase 'normal' y anteponer una anotación de @Test
al método. Tenga en cuenta que NO es necesario iniciar el método con la palabra test
.
import org.junit.*;
import static org.junit.Assert.*;
public class DummyTestB {
@Test
public void Sum() {
int a = 5;
int b = 10;
int result = a + b;
assertEquals(15, result);
}
}
Mezclar los dos parece no ser una buena idea, ver p. this stackoverflow question:
Ahora, mis preguntas (s):
- ¿Cuál es el enfoque preferido, o cuándo se usa uno en lugar de otro?
- El enfoque B permite probar excepciones al extender la anotación @Test como en
@Test(expected = ArithmeticException.class)
. ¿Pero cómo se verifican las excepciones cuando se utiliza el enfoque A? Al utilizar el enfoque A, puede agrupar una serie de clases de prueba en un conjunto de pruebas de la siguiente manera:
TestSuite suite = new TestSuite("All tests");
suite.addTestSuite(DummyTestA.class);
suite.addTestSuite(DummyTestAbis.class);
Pero esto no puede ser utilizado con el enfoque B (ya que cada clase de prueba debe subclasificar TestCase). ¿Cuál es la forma correcta de agrupar las pruebas para el enfoque B?
Editar: ¡Tengo las versiones JUnit a ambos enfoques
Respuesta útil y completa, pero no entiendo completamente "verificar mensaje de excepción". Verificar una cadena codificada va a ser una pesadilla de mantenimiento. Debes haber querido decir "verificar las propiedades de tu tipo de excepción específico". – thSoft
@thSoft: no es frecuente que se use, pero ocasionalmente quiero asegurarme de que el método de excepción menciona el campo ofensivo, por ejemplo. Entonces, un simple 'assertTrue (e.getMessage(). Contains (" foo "))' podría ser útil. –
Incluso en JUnit4, este es un idioma importante cuando tiene que verificar el mensaje o alguna otra propiedad de la excepción (como la causa). El método 'expected' solo comprueba el tipo. – Yishai