Junit перед классом (не статический)



есть ли какие-либо рекомендации , чтобы заставить Junit выполнить функцию один раз в тестовом файле, и он также не должен быть статическим.



как @BeforeClass на нестатической функции?



вот уродливое решение:



@Before void init(){
if (init.get() == false){
init.set(true);
// do once block
}
}


ну это то , что я не хочу делать, и я ищу интегрированное решение junit.

536   8  

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 Примечание. Что-то вроде этого тест:

@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners({CustomTestExecutionListener.class, 
     DependencyInjectionTestExecutionListener.class})
@ContextConfiguration("test-config.xml")
public class DemoTest {
Весна!--3--> содержит, например, этот пустой метод, который можно переопределить:
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 очень хороших решения этой проблемы:

  1. "чистый" junit с пользовательским бегуном (используя интерфейс, но вы можете расширить его с помощью пользовательской аннотации, например @BeforeInstance)
  2. слушатели весеннего исполнения, как упоминалось ранее Espen.

просто использовать @BeforeClass:

@BeforeClass
public static void init() {
}

Это не имеет смысла для init не-статические, потому что каждый тест выполняется в отдельном экземпляре. Экземпляр это init is run on не будет соответствовать экземпляру любого теста.

единственная причина, по которой вы хотите быть нестатическим это для переопределения в подклассах, но вы можете сделать это со статическими методами тоже. Просто используйте одно и то же имя, и только подкласс init метод будет вызван.

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


еще один вариант, который стоит рассмотреть, если используется инъекция зависимостей (например, Spring)@PostConstruct. Это гарантирует, что инъекция зависимостей завершена, чего не было бы в случае конструктор:

@PostConstruct
public void init() {
    // One-time initialization...
}

Comments

    Ничего не найдено.