JUnit 4 @BeforeClass & @AfterClass при использовании Suites

При использовании этого подхода ниже, создав jUnit with Suites. У нас возникла проблема, когда все @BeforeClass в каждом Testclass будут выполнены до того, как начнутся какие-либо тесты. (Для каждого файла n TestClass запускается @BeforeClass, после выполнения которого он запускает первые файлы MyTest.class @Test)

Это приведет к тому, что мы выделяем много ресурсов и памяти. Мои мысли заключались в том, что это должно быть неправильно, не каждый запуск @BeforeClass выполняется только до того, как будет выполнен фактический тест-class, а не при запуске Suite?

@RunWith(Suite.class) @Suite.SuiteClasses({ MyTests.class, Mytests2.class, n1, n2, n }) public class AllTests { // empty } public class MyTests { // no extends here @BeforeClass public static void setUpOnce() throws InterruptedException { ... @Test ... public class MyTests2 { // no extends here @BeforeClass public static void setUpOnce() throws InterruptedException { ... @Test ... 

Напишите метод @BeforeClass в classе AllTests, который будет запущен при запуске пакета.

 public class MyTests1 { @BeforeClass public static void beforeClass() { System.out.println("MyTests1.beforeClass"); } @Before public void before() { System.out.println("MyTests1.before"); } @AfterClass public static void afterClass() { System.out.println("MyTests1.AfterClass"); } @After public void after() { System.out.println("MyTests1.after"); } @Test public void test1() { System.out.println("MyTests1.test1"); } @Test public void test2() { System.out.println("MyTests1.test2"); } } public class MyTests2 { @BeforeClass public static void beforeClass() { System.out.println("MyTests2.beforeClass"); } @Before public void before() { System.out.println("MyTests2.before"); } @AfterClass public static void afterClass() { System.out.println("MyTests2.AfterClass"); } @After public void after() { System.out.println("MyTests2.after"); } @Test public void test1() { System.out.println("MyTests2.test1"); } @Test public void test2() { System.out.println("MyTests2.test2"); } } @RunWith(Suite.class) @Suite.SuiteClasses( { MyTests1.class, MyTests2.class }) public class AllTests { @BeforeClass public static void beforeClass() { System.out.println("AllTests.beforeClass"); } @Before public void before() { System.out.println("AllTests.before"); } @AfterClass public static void afterClass() { System.out.println("AllTests.AfterClass"); } @After public void after() { System.out.println("AllTests.after"); } @Test public void test1() { System.out.println("AllTests.test1"); } @Test public void test2() { System.out.println("AllTests.test2"); } } 

ВЫВОД

 AllTests.beforeClass MyTests1.beforeClass MyTests1.before MyTests1.test1 MyTests1.after MyTests1.before MyTests1.test2 MyTests1.after MyTests1.AfterClass MyTests2.beforeClass MyTests2.before MyTests2.test1 MyTests2.after MyTests2.before MyTests2.test2 MyTests2.after MyTests2.AfterClass AllTests.AfterClass 

НТН

Я не слишком хорошо знаком с @RunWith в JUnit, поэтому я, возможно, сделал что-то не так, но я не могу воспроизвести описанное вами поведение. С classом:

 @RunWith(Suite.class) @Suite.SuiteClasses( { FirstTest.class, SecondTest.class, ThirdTest.class }) public class AllTests { // empty } 

И FirstTest.java выглядит так:

 public class FirstTest { @BeforeClass public static void doBeforeClass() { System.out.println("Running @BeforeClass for FirstTest"); } @Test public void doTest() { System.out.println("Running @Test in " + getClass().getName()); } } 

… с SecondTest.java и ThirdTest.java почти одинаково. Я получаю тестовый результат:

 Running @BeforeClass for FirstTest Running @Test in FirstTest Running @BeforeClass for SecondTest Running @Test in SecondTest Running @BeforeClass for ThirdTest Running @Test in ThirdTest 

Это с JUnit 4.5.0 (по умолчанию JUnit в Eclipse 3.5.1) на JDK от Sun 1.6.0_12. Можете ли вы заметить какую-либо разницу в моем примере? Возможно, другой JDK / JVM? Я не знаю достаточно о внутренних подразделениях JUnit, чтобы знать, могут ли они быть фактором.

Я думаю, @BeforeClass выполняется при instanciation.

  • Как я могу создать тестовый набор в JUnit 4?
  • @RunWith (MockitoJUnitRunner.class) против MockitoAnnotations.initMocks (это)
  • Java: Является ли assertEquals (String, String) надежным?
  • Указание порядка для junit 4 тестов на уровне метода (не уровне classа)
  • Очистка после всех тестов junit
  • Начал ли JUnit4 поддерживать заказ теста? Это намеренно?
  • setUp / tearDown (@ Before / @ After), почему мы нуждаемся в них в JUnit?
  • различия между 2 classами JUnit Assert
  • Interesting Posts

    Все еще достижимый утечек, обнаруженный Valgrind

    Как заставить мое приложение Android отображаться в списке общего доступа другого приложения

    Как программно выложить Views в RelativeLayout?

    ITextSharp вставляет текст в существующий pdf

    Как написать простой метод Ping в Cocoa / Objective-C

    ORA-12514 TNS: слушатель в настоящее время не знает о запрошенной службе в дескрипторе соединения

    Лучшая практика для определения событий кнопки в android

    SUMIF с несколькими критериями соответствия в Excel

    Как использовать розничный лицензионный ключ для Windows 7 Professional для обновления установленной машины Windows 7 Home Premium

    Отправить массив с HTTP Get

    Какое сжатие (GZIP – самый популярный) фильтр сервлетов?

    Настройки удаленного рабочего стола отсутствуют

    Android запускает программный снимок экрана

    Более быстрая реализация словесной арифметики в Prolog

    Почему мы используем if, else, если вместо множественного блока if, если тело является оператором return

    Давайте будем гением компьютера.