Правильный способ сделать это - использовать @Rule
, расширить @ExternalResource
для поведения типов до и после (в синтаксисе Java):
@Rule
public ExternalResource resource= new ExternalResource() {
@Override
protected void before() throws Throwable {
myServer.connect();
};
@Override
protected void after() {
myServer.disconnect();
};
};
Вы можете упорядочить и упорядочить несколько @Rule
вместе по порядку, используя @RuleChain
(введено в 4.10), снова в синтаксисе Java:
@Rule
public TestRule chain= RuleChain
.outerRule(new LoggingRule("outer rule")
.around(new LoggingRule("middle rule")
.around(new LoggingRule("inner rule");
Есть оговорка. Вы не можете указать открытое поле в scala (общедоступные поля оборачиваются методами доступа, а сами поля становятся закрытыми). JUnit проверяет, что @Rule применяется к открытому полю. Исправление для изменения кода JUnit, чтобы вы могли применять @Rule к методам и полям.
Это было исправлено (мной) и было объединено с master, но, к сожалению, оно еще не выпущено: оно будет частью 4.11. Таким образом, у вас есть два варианта: использовать 4.11-SNAPSHOT или загрузить версию 4.10 и применить патч для @ Rule .
Scala-код может выглядеть примерно так:
trait DatabaseTest {
def truncate(): TestRule = {
new ExternalResource() {
override def before() = {
// "TRUNCATE %s".format(tableName)
}
}
}
def extra(): TestRule = {
// return a no-op rule
}
@Rule def testRule() = new RuleChain(truncate(), extra())
def tableName
}
class PersonasTest extends DatabaseTest {
def extra(): TestRule {
new ExternalResource() {
override def before() = {
// "INSERT INTO %s VALUES (...)".format(tableName)
}
}
}
@Test
def testRejectsInsertWhenAlreadyInTable() {
// "INSERT INTO %s VALUES (...)".format(tableName)
}
def tableName = "personas"
}