2011-09-08 21 views

Respuesta

7

EDITAR: Siguiendo el lanzamiento de JUnit 4.11, ahora puede anotar un método con @Rule.

Lo utilizará como:

private TemporaryFolder folder = new TemporaryFolder(); 

@Rule 
public TemporaryFolder getFolder() { 
    return folder; 
} 

Para versiones anteriores de JUnit, ver la respuesta a continuación.

-

No, no se puede utilizar directamente desde esta Scala. El campo debe ser público y no estático. De org.junit.Rule:

public @interface Rule: Annotates fields that contain rules. Such a field must be public, not static, and a subtype of TestRule.

No se puede declarar un ámbito público en Scala. Todos los campos son privados y accesibles por los usuarios. Vea la respuesta a este question.

Además de esto, ya existe una solicitud de mejora de JUnit (todavía abierto):

Extend rules to support @Rule public MethodRule someRule() { return new SomeRule(); }

La otra opción es que se permita a la que Campos no públicos, pero esto ya ha sido rechazada : Allow @Rule annotation on non-public fields.

Así que sus opciones son:

  1. junit clon, y poner en práctica la primera sugerencia, el método, y presentar una solicitud de extracción
  2. Ampliación de la clase Scala de una clase Java que implementa el @Rule

-

public class ExpectedExceptionTest { 
    @Rule 
    public ExpectedException thrown = ExpectedException.none(); 
} 

y luego heredando de que:

class ExceptionsHappen extends ExpectedExceptionTest { 

    @Test 
    def badInt: Unit = { 
    thrown.expect(classOf[NumberFormatException]) 
    Integer.parseInt("one") 
    } 
} 

que funciona correctamente.

+1

Para mayor claridad: que (ahora) trabaja en Scala (pero sólo con el método: '@Rule def MyRule =' ... y no con atributos tales como '@ Regla val myRule = ... ') –

0

Sin conocer las reglas de JUnit, y sin probarlo, porque no tengo una configuración adecuada a mano, me arriesgo y sugiero convertirme en un val. Supongo que es un miembro que se inicializa con algo y luego obtiene algo de estado y luego otra maquinaria comprueba el estado en contra de algo. Siempre estás creando otros nuevos y sigues olvidando las expectativas.

0

Si Scala tiene algo similar a las importaciones estáticas, entonces catch-exception es una alternativa a ExpectedException @Rule de JUnit 4.7.

6

Para que esto funcione con JUnit 4.11 en Scala, debería meta-anotaciones en su anotación por lo que la anotación se aplica sólo al método getter (sintético), no en el campo subyacente:

import org.junit._ 
import scala.annotation.meta.getter 

class ExceptionsHappen { 

    @(Rule @getter) 
    def thrown = rules.ExpectedException.none 

    @Test 
    def badInt: Unit = { 
    thrown.expect(classOf[NumberFormatException]) 
    Integer.parseInt("one") 
    } 
} 
0

Como un novato en Scala sólo estoy usando una solución muy simple: capture explícitamente la excepción y falle si no se lanza su excepción esperada.

A continuación se muestra un esqueleto:

try { 
    *your code that should throw an exception* 
    fail("Did not generate *the.Exception.you.expect*") 
} catch { 
    case t: *the.Exception.you.expect* => // do nothing, it's expected :) 
} 
Cuestiones relacionadas