Очистка после всех тестов джунта - PullRequest
38 голосов
/ 28 марта 2012

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

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


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

Ответы [ 5 ]

41 голосов
/ 28 марта 2012

Я использую 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 имеет эту возможность. Спасибо.

40 голосов
/ 08 февраля 2013

Я рекомендую использовать 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's surefire (модульные тесты) или отказоустойчивым (тесты интеграции), добавив следующий код в конфигурацию плагина:

<properties>
  <property>
    <name>listener</name>
    <value>com.innovatrics.afismq.it.TestListener</value>
  </property>
</properties>
10 голосов
/ 23 марта 2018

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

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

Нет необходимости использовать suite, просто добавьте @BeforeClass и @AfterClass в качестве статического

public class Tests {

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

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

    @Test
    public void testYourTestcase()
    {
        ...
    }
}
0 голосов
/ 28 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...