[java] @BeforeClass 및 상속-실행 순서
단위 테스트 (TestNG 5.10)의 기본으로 사용하는 추상 기본 클래스가 있습니다. 이 클래스에서는 테스트, 데이터베이스 매핑 설정 등을위한 전체 환경을 초기화합니다.이 추상 클래스에는 @BeforeClass
초기화를 수행 하는 주석 이있는 메서드가 있습니다.
다음으로 @Test
메서드와 메서드 가있는 특정 클래스로 해당 클래스를 확장합니다 @BeforeClass
. 이러한 메소드는 환경의 클래스 별 초기화를 수행합니다 (예 : 데이터베이스에 일부 레코드 저장).
@BeforeClass
어노테이션이있는 메소드 의 특정 순서를 적용하려면 어떻게 해야합니까? 확장 클래스의 클래스보다 먼저 실행될 추상 기본 클래스의 클래스가 필요합니다.
예:
abstract class A {
@BeforeClass
doInitialization() {...}
}
class B extends A {
@BeforeClass
doSpecificInitialization() {...}
@Test
doTests() {...}
}
예상 주문 :
A.doInitialization
B.doSpecificInitialization
B.doTests
실제 주문 :
B.doSpecificInitialization // <- crashes, as the base init is missing
(A.doInitialization // <---not executed
B.doTests) // <-/
답변
수업 @BeforeClass
에 넣지 마십시오 abstract
. 각 하위 클래스에서 호출하십시오.
abstract class A {
void doInitialization() {}
}
class B extends A {
@BeforeClass
void doSpecificInitialization() {
super.doInitialization();
}
@Test
void doTests() {}
}
TestNG가 가지고있는 것 같습니다 @BeforeClass(dependsOnMethods={"doInitialization"})
. 시도해보십시오.
답변
편집 : 아래 답변은 JUnit 용 이지만 도움이 될 수 있기 때문에 어쨌든 여기에 남겨 둘 것입니다.
JUnit API 에 따르면 : “슈퍼 클래스의 @BeforeClass 메서드는 현재 클래스보다 먼저 실행됩니다.”
나는 이것을 테스트했고 그것은 나를 위해 작동하는 것 같습니다.
그러나 @Odys가 아래에서 언급했듯이 JUnit의 경우 부모가 섀도 잉되기 때문에 하위 클래스 메서드 만 실행되지만 다른 방식으로 명명 된 두 메서드 가 있어야합니다 .
답변
public
추상 클래스에 추가 하고 TestNG (6.0.1)는 전에 doInitialization ()을 실행했습니다 doTests
. 클래스 A에서 doInitialization()
제거하면 TestNG가 실행되지 않습니다 public
.
public abstract class A {
@BeforeClass
doInitialization() {...}
}
class B extends A {
@Test
doTests() {...}
}
답변
방금 5.11에서 예제를 시도했는데 먼저 기본 클래스의 @BeforeClass가 호출되었습니다.
testng.xml 파일을 게시 할 수 있습니까? A와 B를 모두 지정하고 B 만 필요합니다.
testng-users 메일 링리스트에서 자유롭게 후속 조치를 취하면 문제를 자세히 살펴볼 수 있습니다.
-세드릭
답변
나는 이것을 겪었고 이것을 달성하는 또 다른 방법을 찾았습니다. 그냥 사용 alwaysRun
에 @BeforeClass
또는 @BeforeMethod
당신이 예상하는대로 추상 클래스에서 작동합니다.
public class AbstractTestClass {
@BeforeClass(alwaysRun = true)
public void generalBeforeClass() {
// do stuff
specificBeforeClass();
}
}
답변
내가 실행할 때 : JUnitCore.runClasses (TestClass.class); 이클립스에서 실행하는 경우 : 어떤 이유로 기본 클래스를 실행하지 못합니다 . (Super.SetUpBeforeClass ();는
필요하지 않습니다 .) 해결 방법 : 기본 클래스를 명시 적으로 호출합니다. ( BaseTest.setUpBeforeClass (); ) 응용 프로그램에서 실행하는 경우 기본 클래스에 플래그를 지정하여 이미 설정되었는지 여부를 확인할 수 있습니다. 따라서 가능한 두 가지 방법 (예 : 개인 테스트의 경우 Eclipse에서, 빌드 릴리스의 경우 ANT를 통해)을 통해 실행하는 경우 한 번만 실행됩니다.
이것은 Eclipse의 버그이거나 최소한 예상치 못한 결과로 보입니다 ..
답변
JUnit의 경우 : @fortega가 언급했듯이 : JUnit API에 따르면 “슈퍼 클래스의 @BeforeClass 메서드는 현재 클래스보다 먼저 실행됩니다.”
그러나 같은 이름으로 두 메서드의 이름을 지정하지 않도록주의 하십시오 . 이 경우 부모 메서드는 자식 부모에 의해 숨겨집니다. 소스 .