Очистка после всех тестов junit

В моем проекте мне нужно сделать некоторые настройки репозитория перед всеми тестами. Это делается с использованием некоторых сложных статических правил. Однако я не знаю, как очистить после всех тестов. Я не хочу, чтобы какое-то магическое статическое число ссылалось на количество всех методов тестирования, которые я должен поддерживать все время.

Самый ценный способ - добавить слушателя, который будет вызываться после всех тестов. Есть ли какой-либо интерфейс для него уже в JUnit4?


edit: это не имеет ничего общего с @BeforeClass и @AfterClass, поэтому я должен знать, вызван ли метод, аннотированный с помощью @AfterClass в последний раз.

Ответ 1

Я использую JUnit 4.9. Будет ли это помогать?:

import junit.framework.TestCase;

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;

@RunWith(Suite.class)
@SuiteClasses({First.class,Second.class,Third.class})
public class RunTestSuite extends TestCase {
    @BeforeClass
    public static void doYourOneTimeSetup() {
        ...
    }

    @AfterClass
    public static void doYourOneTimeTeardown() {
        ...
    }    
}

Изменить: Я вполне уверен (если я не пойму вас на вопрос), что мое решение - это то, что вы ищете. то есть один метод разрыва после всех тестов. Нет слушателя, JUnit имеет это средство. Спасибо.

Ответ 2

Я рекомендую использовать org.junit.runner.notification.RunListener, например:

public class TestListener extends RunListener {
  @Override
  public void testRunStarted(Description description) throws Exception {
     // Called before any tests have been run.
  }
  @Override
  public void testRunFinished(Result result) throws Exception {
     // Called when all tests have finished
  }
}

Подробнее читайте в JUnit java doc. Вы можете использовать это даже с плагином Maven surefire (unit tests) или отказоустойчивым плагином (интеграционные тесты), добавив следующий код в конфигурацию плагина:

<properties>
  <property>
    <name>listener</name>
    <value>com.innovatrics.afismq.it.TestListener</value>
  </property>
</properties>

Ответ 3

Вы всегда можете написать свой собственный TestRunner. Однако, прежде чем вы это сделаете, вам нужно будет оценить необходимость в том же. Лучше использовать @BeforeClass и @AfterClass. Другим примером, на который я могу указать, является способ, с помощью которого hibernate позволяет пользователям выполнять модульное тестирование с использованием "import.sql".

Ответ 4

Не нужно использовать набор, просто добавьте @BeforeClass и @AfterClass как статические

public class Tests {

    @BeforeClass
    public static void doYourOneTimeSetup()
    {
        ...
    }

    @AfterClass
    public static void doYourOneTimeTeardown() {
        ...
    }    

    @Test
    public void testYourTestcase()
    {
        ...
    }
}

Ответ 5

Просто столкнулся с той же проблемой.
Мое решение:

  • Для глобальной настройки: используйте (ленивый) singleton для доступа к чему-то глобальному, который требует создания экземпляра перед тестированием. Первый тест, который обращается к этому синглтону, вызовет глобальный процесс настройки.
  • Для глобального срыва: используйте Java shutdown hook:
    Runtime.getRuntime().addShutdownHook(new Thread(() -> do_your_global_cleanup())));