Я унаследовал некоторые тесты JUnit, написанные в scala, которые должны быть исправлены для использования семантики @BeforeClass. Я понимаю, что аннотация @BeforeClass должна применяться только к статическим методам. Я понимаю, что методы, определенные в "компаньонных" объектах (в отличие от классов scala), являются статическими. Как я могу получить метод тестирования, который будет вызываться один раз перед отдельными методами экземпляра в тестовом классе?
Как вы реализуете семантику @BeforeClass в тесте JUnit 4, написанном в 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 (оба фреймворка поддерживают это), чтобы он интегрировался с любыми другими инструментами и процессами, которые вы уже существуют.