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
, но это не сработало.
Ответы
Ответ 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");
}