Есть ли любые лучшие практики для получения, Junit выполняют функцию однажды в тестовом файле, и это не должно также быть статично.
как @BeforeClass
на не статическая функция?
Вот ужасное решение:
@Before void init(){
if (init.get() == false){
init.set(true);
// do once block
}
}
хорошо это - что-то, что я не хочу делать, и я ищу интегрированное junit решение.
Если вы не хотите настраивать статические инициализаторы для однократной инициализации и не особо разбираетесь в использовании 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 @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 {
Spring AbstractTestExecutionListener
содержит, например, это пустой метод, который можно переопределить:
public void beforeTestClass(TestContext testContext) throws Exception {
/* no-op */
}
ПРИМЕЧАНИЕ: НЕ пропускайте / пропускайте DependencyInjectionTestExecutionListener
при добавлении пользовательских TestExecutionListeners
. Если вы это сделаете, все автоматы будут нулевыми
.