Подтвердить что ты не робот

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, но это не сработало.

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

Используйте @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");
    }

}

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

попробуйте использовать @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");
}