Java jUnit: код тестового набора для запуска перед любыми тестовыми классами

У меня есть класс тестового набора:

@RunWith(Suite.class)
@Suite.SuiteClasses({
 GameMasterTest.class,
 PlayerTest.class,
})
public class BananaTestSuite {

Какую аннотацию следует использовать для создания функции в этом классе перед любым классом, содержащим фактические тесты? Прямо сейчас, я делаю это, и он работает, но это не так читаемо, как могло бы быть:

static {
 try {
 submitPeelAction = new Player(new GameMaster(1)).getClass().getDeclaredMethod("submitPeelAction");
 } catch (SecurityException e) {
 e.printStackTrace();
 } catch (NoSuchMethodException e) {
 e.printStackTrace();
 }
 submitPeelAction.setAccessible(true);
}

Я пробовал @BeforeClass, но это не сработало.

5 ответов

Создайте класс супертестов, содержащий метод, аннотированный с помощью @BeforeClass. Расширьте все классы тестов из этого класса, например,

@Ignore
public class BaseTest {
 @BeforeClass
 public static void setUpBaseClass() {
 //Do the necessary setup here
 }
}

Этот метод будет запущен перед любым аннотированным методом @BeforeClass в подклассах: Source. Убедитесь, что это имя метода не используется в каком-либо подклассе для предотвращения затенения.

Если вам нужно запустить это только один раз (например, если вы создаете/инициализируете большой ресурс для всех тестов), установите флаг в суперклассе, чтобы проверить, запущен ли этот метод или нет.

Эта конструкция также гарантирует, что если вы измените тестовый бегун, вам не нужно ничего менять.


Используйте @Before для setUp() и @After для методов tearDown.

EDIT: после некоторых тестов я обнаружил, что @Before и @After не работает для Test Suite. В вашем случае вы должны использовать @BeforeClass и статический метод для инкапсуляции кода инициализации.

@RunWith(Suite.class)
@SuiteClasses( { ContactTest.class })
public class AllTests {
 @BeforeClass
 public static void init() {
 System.out.println("Before all");
 }
}


Прежде всего: если вы до последнего JUnit, то есть 4.7 или выше, вы также можете сделать это с помощью правил. Для начальной точки см. http://www.infoq.com/news/2009/07/junit-4.7-rules.

Насколько я понимаю, статический блок в классе пакета является хорошим решением.

Недостатком является то, что он будет вызываться только тогда, когда вы запускаете весь костюм, а не отдельные тесты или тестовые классы. Таким образом, альтернативой может быть вызов того же статического метода в классе пакета из методов @BeforeClass во всех ваших классах.


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

повторно. ваши комментарии, @BeforeClass отлично работает. Вы бросаете исключение в этот метод?


попробуйте использовать @before и создайте метод, в котором экземпляры всех объектов вам нужны, если вам нужно что-то очистить после окончания просто использовать @After

что-то вроде этого:

@Before
public void instanceMeasureList() {
 /* all what you need to execute before starting your tests
 */
}
@Test
public void testRequest() {
 fail("Not yet implemented");
}
@Test
public void testEpochDate() {
 fail("Not yet implemented");
}
@After 
public void deleteOutputFile() {
 fail("Not yet implemented");
}

licensed under cc by-sa 3.0 with attribution.