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.
}
JUnit 4 @Before
및에 해당하는 TestNG의 @After
경우 @BeforeMethod
및 @AfterMethod
각각을 사용할 수 있습니다 .
답변
간단한 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;
}
}
...
답변
빈 생성자를 사용하는 것이 가장 쉬운 해결책입니다. 확장 클래스에서 생성자를 계속 재정의 할 수 있습니다.
그러나 그것은 모든 상속에 최적이 아닙니다. 이것이 JUnit 4가 대신 주석을 사용하는 이유입니다.
또 다른 옵션은 factory / util 클래스에 도우미 메서드를 만들고 해당 메서드가 작업을 수행하도록하는 것입니다.
Spring을 사용하는 경우 @TestExecutionListeners
주석 사용을 고려해야합니다 . 이 테스트와 같은 것 :
@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners({CustomTestExecutionListener.class,
DependencyInjectionTestExecutionListener.class})
@ContextConfiguration("test-config.xml")
public class DemoTest {
AbstractTestExecutionListener
예를 들어 Spring 에는 재정의 할 수있는이 빈 메서드가 포함되어 있습니다.
public void beforeTestClass(TestContext testContext) throws Exception {
/* no-op */
}
참고 : NOT 간과 / 미스 DO DependencyInjectionTestExecutionListener
사용자를 추가하는 동안 TestExecutionListeners
. 그렇게하면 모든 autowire가 null
.
답변
@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/
유일한 제한 : Spring 테스트 에서만 작동합니다 .
(저는이 테스트 라이브러리의 개발자입니다)
답변
나는 시도한 적이 없지만 인수가없는 생성자를 만들고 거기에서 함수를 호출 할 수 있습니까?
답변
이 기사 에서는이 문제에 대한 두 가지 매우 좋은 해결책에 대해 설명합니다.
- 사용자 지정 Runner로 “clean”junit (인터페이스를 사용하지만 @BeforeInstance와 같은 사용자 지정 주석으로 확장 할 수 있음)
- 앞서 Espen에서 언급 한 스프링 실행 리스너.
답변
업데이트 : 아래 제안에 결함이있는 이유는 Cherry의 의견을 참조하십시오. (댓글이 작동하지 않는 이유에 대해 다른 사람들에게 유용한 정보를 제공 할 수 있으므로 삭제하는 대신 여기에 답변을 유지하고 있습니다.)
의존성 주입 (예 : Spring)을 사용하는 경우 고려해야 할 또 다른 옵션은 @PostConstruct
. 이렇게하면 종속성 주입이 완료되며 생성자에서는 그렇지 않습니다.
@PostConstruct
public void init() {
// One-time initialization...
}