Ignorar condicionalmente las pruebas en JUnit 4

OK, entonces la anotación @Ignore es buena para marcar que no se debe ejecutar un caso de prueba.

Sin embargo, a veces quiero ignorar una prueba basada en la información de tiempo de ejecución. Un ejemplo podría ser si tengo una prueba de concurrencia que necesita ejecutarse en una máquina con un cierto número de núcleos. Si esta prueba se ejecutara en una máquina uniprocesador, no creo que sea correcto pasar la prueba (ya que no se ha ejecutado), y ciertamente no sería correcto suspender la prueba y romper la construcción. .

Así que quiero poder ignorar las pruebas en tiempo de ejecución, ya que este parece ser el resultado correcto (dado que el marco de prueba permitirá que la construcción pase, pero que las pruebas no se hayan ejecutado). Estoy bastante seguro de que la anotación no me dará esta flexibilidad, y sospecho que tendré que crear manualmente el conjunto de pruebas para la clase en cuestión. Sin embargo, la documentación no menciona nada sobre esto y examina la API , tampoco está claro cómo se haría programáticamente (es decir, cómo creo programáticamente una instancia de Test o similar que sea equivalente a la creada por la anotación @Ignore ?).

Si alguien ha hecho algo similar en el pasado, o tiene una idea shiny de cómo más podría hacerlo, me gustaría saberlo.

La forma JUnit es hacer esto en tiempo de org.junit.Assume es org.junit.Assume .

  @Before public void beforeMethod() { org.junit.Assume.assumeTrue(someCondition()); // rest of setup. } 

Puede hacerlo en un método @Before o en la prueba en sí, pero no en un método @Before . Si lo haces en la prueba en sí, se @Before tu método @Before . También puede hacerlo dentro de @BeforeClass para evitar la inicialización de clase.

Una falla de suposición hace que la prueba sea ignorada.

Editar: para comparar con la anotación @RunIf de junit-ext , su código de ejemplo se vería así:

 @Test public void calculateTotalSalary() { assumeThat(Database.connect(), is(notNull())); //test code below. } 

Sin mencionar que es mucho más fácil capturar y usar la conexión del método Database.connect() esta manera.

Debes pagar el proyecto de Junit-ext . Tienen la anotación RunIf que realiza pruebas condicionales, como:

 @Test @RunIf(DatabaseIsConnected.class) public void calculateTotalSalary() { //your code there } class DatabaseIsConnected implements Checker { public boolean satisify() { return Database.connect() != null; } } 

[Ejemplo de código tomado de su tutorial]

En JUnit 4, otra opción para usted puede ser crear una anotación para indicar que la prueba debe cumplir con sus criterios personalizados, luego extender el corredor predeterminado con el suyo y usar el reflection, basar su decisión en los criterios personalizados. Puede parecerse a esto:

 public class CustomRunner extends BlockJUnit4ClassRunner { public CTRunner(Class< ?> klass) throws initializationError { super(klass); } @Override protected boolean isIgnored(FrameworkMethod child) { if(shouldIgnore()) { return true; } return super.isIgnored(child); } private boolean shouldIgnore(class) { /* some custom criteria */ } } 

Una nota rápida: Assume.assumeTrue(condition) ignora el rest de los pasos, pero pasa la prueba. Para suspender la prueba, use org.junit.Assert.fail() dentro de la statement condicional. Funciona igual que Assume.assumeTrue() pero falla la prueba.