it-roy-ru.com

Очистка после всех тестов джунта

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

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


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

37
Mateusz Chromiński

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

38
HellishHeat

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

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

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

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

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

public class Tests {

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

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

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

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

0
questzen