Junit перед классом (не статический)
есть ли какие-либо рекомендации , чтобы заставить Junit выполнить функцию один раз в тестовом файле, и он также не должен быть статическим.
как @BeforeClass на нестатической функции?
вот уродливое решение:
@Before void init(){
if (init.get() == false){
init.set(true);
// do once block
}
}
ну это то , что я не хочу делать, и я ищу интегрированное решение junit.
8 ответов:
если вы не хотите настраивать статические инициализаторы для однократной инициализации и не особенно заинтересованы в использовании JUnit, взгляните на TestNG. TestNG поддерживает нестатическую, одноразовую инициализацию с различными параметрами конфигурации, все с использованием аннотаций.
в TestNG это будет эквивалентно:
@org.testng.annotations.BeforeClass public void setUpOnce() { // One time initialization. }для демонтажа,
@org.testng.annotations.AfterClass public void tearDownOnce() { // One time tear down. }для эквивалента TestNG JUnit 4's
@Beforeи@After, вы можете использовать@BeforeMethodи@AfterMethodсоответственно.
использовать пустой конструктор-это самое простое решение. Вы все еще можете переопределить конструктор в расширенном классе.
но это не оптимально со всем наследованием. Вот почему JUnit 4 использует аннотации вместо этого.
другой вариант-создать вспомогательный метод в классе factory / util и позволить этому методу выполнять работу.
если вы используете Spring, вы должны рассмотреть возможность использования
@TestExecutionListenersПримечание. Что-то вроде этого тест:Весна!--3--> содержит, например, этот пустой метод, который можно переопределить:@RunWith(SpringJUnit4ClassRunner.class) @TestExecutionListeners({CustomTestExecutionListener.class, DependencyInjectionTestExecutionListener.class}) @ContextConfiguration("test-config.xml") public class DemoTest {public void beforeTestClass(TestContext testContext) throws Exception { /* no-op */ }
простой оператор if, похоже, тоже работает довольно хорошо:
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"classpath:test-context.xml"}) public class myTest { public static boolean dbInit = false; @Autowired DbUtils dbUtils; @Before public void setUp(){ if(!dbInit){ dbUtils.dropTables(); dbUtils.createTables(); dbInit = true; } } ...
легко использовать
@BeforeAllMethods/@AfterAllMethodsаннотации для запуска метода внутри контекста экземпляра (нестатического), где будут доступны все введенные значения.для этого есть специальная библиотека тестирования:
https://mvnrepository.com/artifact/org.bitbucket.radistao.test/before-after-spring-test-runner/0.1.0
https://bitbucket.org/radistao/before-after-spring-test-runner/
единственное ограничение: работает только ибо Весна тестирование.
(Я разработчик этой библиотеки тестирование)
Я никогда не пробовал, но может быть, вы можете создать конструктор без аргументов и вызов функции вы оттуда?
статьи обсудите 2 очень хороших решения этой проблемы:
- "чистый" junit с пользовательским бегуном (используя интерфейс, но вы можете расширить его с помощью пользовательской аннотации, например @BeforeInstance)
- слушатели весеннего исполнения, как упоминалось ранее Espen.
просто использовать
@BeforeClass:@BeforeClass public static void init() { }Это не имеет смысла для
initне-статические, потому что каждый тест выполняется в отдельном экземпляре. Экземпляр этоinitis run on не будет соответствовать экземпляру любого теста.единственная причина, по которой вы хотите быть нестатическим это для переопределения в подклассах, но вы можете сделать это со статическими методами тоже. Просто используйте одно и то же имя, и только подкласс
initметод будет вызван.
обновление: пожалуйста, смотрите комментарий вишни для того, почему предложение ниже является ошибочным. (Я держу ответ здесь, а не удаляю, поскольку комментарий может предоставить полезную информацию другим о том, почему это не работа.)
еще один вариант, который стоит рассмотреть, если используется инъекция зависимостей (например, Spring)@PostConstruct. Это гарантирует, что инъекция зависимостей завершена, чего не было бы в случае конструктор:@PostConstruct public void init() { // One-time initialization... }
Comments