tutorial - que es una prueba unitaria java
JUnit: Habilitar aserciones en clase bajo prueba (4)
Como dice un amigo mío ... ¿por qué tomarse el tiempo para escribir una afirmación si solo vas a apagarla?
Dado que todas las afirmaciones de lógica deben convertirse en:
if(!(....))
{
// or some other appropriate RuntimeException subclass
throw new IllegalArgumentException(".........");
}
Para responder a tu pregunta de una manera que probablemente quieras :-)
import org.junit.BeforeClass;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
@RunWith(Suite.class)
@Suite.SuiteClasses({
FooTest.class,
BarTest.class
})
public class TestSuite
{
@BeforeClass
public static void oneTimeSetUp()
{
ClassLoader.getSystemClassLoader().setDefaultAssertionStatus(true);
}
}
Luego ejecute el conjunto de pruebas en lugar de cada prueba. Esto debería (funciona en mis pruebas, pero no leí las partes internas del código del marco de JUnit) dar como resultado que se establezca el estado de aserción antes de que se carguen las clases de prueba.
Algunas declaraciones de afirmación de Java me han criticado algunas veces en el conjunto de pruebas JUnit porque las aserciones no estaban habilitadas en la instancia de JVM de JUnit. Para que quede claro, estas son afirmaciones de "recuadro negro" dentro de las implementaciones (verificar invariantes, etc.), no las afirmaciones definidas por las pruebas JUnit. Por supuesto, me gustaría detectar cualquier falla de aserción en el conjunto de pruebas.
La solución obvia es tener mucho cuidado de usar las -enableassertions
siempre que ejecute JUnit, pero preferiría una solución más robusta. Una alternativa es agregar la siguiente prueba a cada clase de prueba:
@Test(expected=AssertionError.class)
public void testAssertionsEnabled() {
assert(false);
}
¿Hay una manera más automática de lograr esto? ¿Una opción de configuración de todo el sistema para JUnit? ¿Una llamada dinámica que podría poner en el método setUp()
?
Propongo tres soluciones posibles (¿simples?) Que me funcionan después de una prueba rápida (pero es posible que deba verificar los efectos secundarios del uso de un bloque de inicializador estático)
1.) Agregue un bloque de inicializador estático a aquellos casos de prueba que dependen de que las aserciones estén habilitadas
import ....
public class TestXX....
...
static {
ClassLoader.getSystemClassLoader().setDefaultAssertionStatus(true);
}
...
@Test(expected=AssertionError.class)
...
...
2.) Cree una clase base que amplíe todas sus clases de prueba que necesiten aserciones habilitadas
public class AssertionBaseTest {
static {
//static block gets inherited too
ClassLoader.getSystemClassLoader().setDefaultAssertionStatus(true);
}
}
3.) Crea un conjunto de pruebas que ejecute toda tu prueba
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
@RunWith(Suite.class)
@Suite.SuiteClasses({
//list of comma-separated classes
/*Foo.class,
Bar.class*/
})
public class AssertionTestSuite {
static {
//should run before the test classes are loaded
ClassLoader.getSystemClassLoader().setDefaultAssertionStatus(true);
}
public static void main(String args[]) {
org.junit.runner.JUnitCore.main("AssertionTestSuite");
}
}
Alternativamente, puede compilar su código de forma tal que las afirmaciones no puedan desactivarse. En Java 6, puedes usar "fa.jar - Force assertion check incluso cuando no esté activado" , un pequeño truco mío.
En Eclipse, puede ir a Windows
→ Preferences
→ Java
→ JUnit
, que tiene una opción para agregar -ea
cada vez que se crea una nueva configuración de inicio. Agrega la opción -ea
a la configuración de depuración también.
El texto completo al lado de una casilla de verificación es
Agregue ''-ea'' a los argumentos de VM al crear una nueva configuración de inicio JUnit