Как реализовать семантику @BeforeClass в тесте JUnit 4, написанном на scala? - PullRequest
11 голосов
/ 22 апреля 2011

Я унаследовал некоторые тесты JUnit, написанные на scala, которые необходимо исправить, чтобы использовать семантику @BeforeClass. Я понимаю, что аннотация @BeforeClass должна применяться только к статическим методам. Я понимаю, что методы, определенные в «сопутствующих» объектах (в отличие от классов Scala), являются статическими. Как я могу получить метод тестирования, который будет вызван один раз перед методами отдельных экземпляров в классе тестирования?

Ответы [ 3 ]

17 голосов
/ 20 октября 2011
object TestClass {

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

}

class TestClass {

  @Test
  ...

}

похоже на работу ...

2 голосов
/ 04 апреля 2012

Мне пришлось перейти на specs2, чтобы реализовать эту функцию с помощью Scala. Просто добавьте пример, чтобы помочь людям с такой же проблемой, как у оригинального автора, которые еще не знают спецификации2.

Способ specs2 использует концепцию «шага» для выполнения настройки и демонтажа набора тестов. Если вы работаете с JUnitRunner, все ваши скрипты Ant и IDE, которые используют JUnit, все равно будут знать, как его запустить. Вот пример использования изменяемой спецификации из 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"}
}

А вот пример с неизменяемой спецификацией:

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"
  }
}
0 голосов
/ 23 апреля 2011

Вы не указываете, имеете ли вы в виду унаследованное в смысле ОО-программирования или слово «перенято от кого-то другого».

В последнем случае я бы посоветовал вам повторно-пишите вещь, используя ScalaTest или Specs2, и выставьте ее как тест JUnit (обе платформы поддерживают это), чтобы она интегрировалась с любыми другими инструментами и процессами, которые у вас уже есть.

...