Как вы реализуете семантику @BeforeClass в тесте JUnit 4, написанном в scala?

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

Ответ 1

object TestClass {

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

}

class TestClass {

  @Test
  ...

}

похоже, работает...

Ответ 2

Мне пришлось перейти к 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"
  }
}

Ответ 3

Вы не указываете, имеете ли вы унаследованное в смысле OO-программирования или значение "взято с кем-то другого".

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