2011-04-22 7 views
11

He heredado algunas pruebas JUnit escritas en scala que deben corregirse para usar la semántica @BeforeClass. Entiendo que la anotación @BeforeClass se debe aplicar solo a métodos estáticos. Entiendo que los métodos definidos en objetos "acompañantes" (a diferencia de las clases scala) son estáticos. ¿Cómo puedo hacer que se llame a un método de prueba una vez antes de los métodos de instancia individuales en una clase de prueba?¿Cómo se implementa la semántica @BeforeClass en una prueba JUnit 4 escrita en scala?

Respuesta

0

No especifica si se refiere heredado en el sentido de programación OO o el sentido de la palabra "tomado de otra persona".

En este último caso, le aconsejo que vuelva a escribir la cosa utilizando ScalaTest o Specs2 y la exponga como una prueba JUnit (ambos marcos lo admiten) para que se integre con cualquier otra herramienta y proceso usted ya tiene en su lugar.

+0

que quería decir "heredado" en el sentido humano. Hoy he estado leyendo en ScalaTest y probablemente proceda en esa dirección. Gracias. –

16
object TestClass { 

    @BeforeClass 
    def stuff() { 
    // beforeclass stuff 
    } 

} 

class TestClass { 

    @Test 
    ... 

} 

parece que funciona ...

2

que tenía que pasar a specs2 para implementar esta función con Scala. Solo agregue un ejemplo para ayudar a las personas con el mismo problema que el afiche original que aún no conocen las especificaciones2.

El modo specs2 utiliza el concepto de "paso" para lograr la configuración y el desmontaje del conjunto de pruebas. Si ejecuta con un JUnitRunner todos sus scripts Ant y IDE que usan JUnit todavía sabrán cómo ejecutarlo. Aquí hay un ejemplo usando una especificación mutable de specs2:

import org.specs2.mutable.Specification 
import org.junit.runner.RunWith 
import org.specs2.runner.JUnitRunner 

@RunWith(classOf[JUnitRunner]) 
class MutableSpecs2ExampleTest extends Specification { 

    var firstStep: String = null 
    var secondStep: String = null 
    var thirdStep: String = null 
    //Steps are guaranteed to run serially 
    step{println("Loading Spring application context...");firstStep="Hello World"} 
    step{println("Setting up mocks...");secondStep = "Hello Scala"} 

    //The fragments should be run in parallel by specs2 
    "Some component Foo in my project" should{ 
    " pass these tests" in { 
     println("Excersizing some code in Foo") 
     firstStep must startWith("Hello") and endWith("World") 
    } 
    " pass theses other tests" in { 
     println("Excersizing some other code in Foo") 
     firstStep must have size(11) 
    } 
    } 
    "Some component Bar in my project" should{ 
    " give the correct answer" in { 
     println("Bar is thinking...") 
     secondStep must startWith("Hello") and endWith("Scala") 
     thirdStep must be equalTo null 
    } 
    } 
    step{println("Tearing down resources after tests...");thirdStep = "Hello Specs2"} 
} 

Y he aquí un ejemplo de una especificación no mutable:

import org.specs2.Specification 
import org.specs2.specification.Step 
import org.junit.runner.RunWith 
import org.specs2.runner.JUnitRunner 

@RunWith(classOf[JUnitRunner]) 
class Specs2ExampleTest extends Specification{ 
    var firstStep: String = null 
    var secondStep: String = null 
    var thirdStep: String = null 

    def is = 
    "This is a test with some set-up and tear-down examples"^
                  p^ 
    "Initialize"           ^
                  Step(initializeDependencies())^ 
                  Step(createTestData())^ 
    "Component Foo should"        ^
     "perform some calculation X "      !testX^ 
     "perform some calculation Y"       !testY^ 
                  p^ 
    "Tidy up"           ^
                  Step(removeTestData())^ 
                  end 
    def testX = { 
     println("testing Foo.X") 
     firstStep must be equalTo("Hello World") 
    } 
    def testY = { 
     println("testing Foo.Y") 
     secondStep must be equalTo("Hello Scala") 
     thirdStep must be equalTo null 
    } 

    def initializeDependencies(){ 
    println("Initializing Spring applicaiton context...") 
    firstStep = "Hello World" 
    } 
    def createTestData(){ 
    println("Inserting test data into the db...") 
    secondStep = "Hello Scala" 
    } 

    def removeTestData(){ 
    println("Removing test data from the db...") 
    println("Tearing down resources...") 
    thirdStep = "Hello Specs2" 
    } 
} 
Cuestiones relacionadas