@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) // <-/
편집: 아래 답변은 JUnit용입니다만, 도움이 될 수 있기 때문에, 어쨌든 여기에 둡니다.
JUnit api에 따르면 "슈퍼클래스의 @BeforeClass 메서드는 현재 클래스보다 먼저 실행됩니다."
제가 이걸 테스트해봤는데, 저한테는 효과가 있는 것 같아요.
단, @Odys가 아래에 언급했듯이 JUnit의 경우 두 메서드의 이름을 다르게 지정해야 합니다.그렇지 않으면 부모 메서드가 음영 처리되기 때문에 하위 클래스 메서드만 실행됩니다.
넣넣 the the 는 넣지 마세요@BeforeClass
abstract
각 서브클래스에서 불러주세요
abstract class A {
void doInitialization() {}
}
class B extends A {
@BeforeClass
void doSpecificInitialization() {
super.doInitialization();
}
@Test
void doTests() {}
}
TestNG는 이미 시행된 것 같습니다.
는 ㅇㅇㅇㅇㅇㅇㅇㅇ다를 넣었습니다.public
doTests
. 는 되지 않습니다 Test NGdoInitialization()
을 public
A★★★★★★★★★★★★★★★★★★★★★★★★★」
public abstract class A {
@BeforeClass
doInitialization() {...}
}
class B extends A {
@Test
doTests() {...}
}
방금 5.11의 예를 시험했는데 베이스 클래스의 @BeforeClass가 먼저 호출됩니다.
testng.xml 파일을 게시할 수 있습니까?B만 필요한 상태에서 A와 B를 모두 지정하는 것일 수 있습니다.
테스트 유저 메일링 리스트의 폴로 업을 실시해 주세요.당신이 안고 있는 문제를 자세히 조사할 수 있습니다.
-- 세드릭
나는 방금 이것을 검토했고 이것을 성취할 수 있는 방법을 하나 더 찾았다. 쓰세요.alwaysRun
@BeforeClass
★★★★★★★★★★★★★★★★★」@BeforeMethod
추상 수업에서 예상대로 작동합니다.
public class AbstractTestClass {
@BeforeClass(alwaysRun = true)
public void generalBeforeClass() {
// do stuff
specificBeforeClass();
}
}
JUnit의 경우:@fortega가 언급했듯이:JUnit api에 따르면 "슈퍼클래스의 @BeforeClass 메서드는 현재 클래스보다 먼저 실행됩니다."
단, 두 메서드에 같은 이름을 붙이지 않도록 주의해 주십시오.이 경우 부모 메서드는 자녀 부모에 의해 숨겨지기 때문입니다.출처.
실행원: JUnitCore.runClasses(TestClass.class);그러면 부모가 자식보다 먼저 올바르게 실행됩니다(슈퍼 기능은 필요 없습니다.SetUpBeforeClass();) 이클립스에서 실행하는 경우:어떤 이유로 기본 클래스를 실행하지 못합니다.회피책: 베이스 클래스를 상세하게 호출한다: (BaseTest.setUpBeforeClass();) 어플리케이션에서 실행할 경우 베이스 클래스에 플래그를 설정하여 이미 셋업되었는지 여부를 판별할 수 있습니다.따라서 가능한 두 가지 방법(예: 개인 테스트의 경우 이클립스에서, 빌드 릴리스의 경우 ANT를 통해)을 모두 실행하는 경우 한 번만 실행됩니다.
이클립스의 버그 또는 적어도 예기치 않은 결과인 것 같습니다.
다음과 같이 @BeforeClass 메서드에서 빈 specificBeforeClass() 메서드를 호출하여 서브클래스에 의해 덮어쓰거나 덮어쓰지 않도록 합니다.
public class AbstractTestClass {
@BeforeClass
public void generalBeforeClass() {
// do stuff
specificBeforeClass();
}
protected void specificBeforeClass() {}
}
public class SpecificTest {
@Override
protected void specificBeforeClass() {
// Do specific stuff
}
// Tests
}
dependsOnMethod
사용할 수 있습니다.
예: 스프링(Spring)의 경우AbstractTestNGSpringContextTests
)
@BeforeClass(alwaysRun = true, dependsOnMethods = "springTestContextPrepareTestInstance")
Import 명세서를 확인합니다.그럴 것 같네요.
import org.testng.annotations.BeforeClass;
것은 아니다.
import org.junit.BeforeClass;
이건 나한테 효과가 있어.
abstract class A {
@BeforeClass
doInitialization() {...}
}
class B extends A {
@Override
@BeforeClass
doInitialization() {
//do class specific init
}
@Test
doTests() {...}
}
슈퍼클래스의 BeforeClass 주석 메서드에서 호출된 추상 메서드 doSpecialInit()를 슈퍼클래스에서 만들어 보는 것은 어떨까요?
따라서 클래스를 상속하는 개발자는 이 메서드를 구현해야 합니다.
여기 또 다른 쉬운 해결책이 있습니다.
특히 슈퍼클래스의 'BeforeClass'가 실행되기 전에 서브클래스의 'BeforeClass'에서 모의 서비스를 삽입해야 하는 상황입니다.
이렇게 하려면 - 단순히@ClassRule
서브클래스에 있습니다.
예를 들어 다음과 같습니다.
@ClassRule
public static ExternalResource mocksInjector = new ExternalResource() {
@Override
protected void before() {
// inject my mock services here
// Note: this is executed before the parent class @BeforeClass
}
};
이게 도움이 됐으면 좋겠어요.이를 통해 정적 설정을 "역" 순서로 효과적으로 실행할 수 있습니다.
오늘 비슷한 문제에 직면했습니다. 유일한 차이점은 기본 클래스가 추상적이지 않았다는 것입니다.
여기 내 케이스가 있다
public class A {
@BeforeClass
private void doInitialization() {...}
}
public class B extends A {
@BeforeClass
private void doSpecificInitialization() {...}
@Test
public void doTests() {...}
}
라는 일이 일어났다.@BeforeClass
클래스 A의 메서드는 실행되지 않았습니다.
- A.doInitialization() -> 이것은 사일런트하게 실행되지 않았습니다.
- B.doSpecific Initialization()
- B.doTests()
프라이버시 수식어를 가지고 놀다가 TestNG가 실행하지 않는다는 것을 알게 되었습니다.@BeforeClass
클래스에서 볼 수 없는 경우 상속된 클래스에서 주석이 달린 메서드
이 방법은 다음과 같습니다.
public class A {
@BeforeClass
private void doInitialization() {...}
}
public class B extends A {
@BeforeClass
//Here a privacy modifier matters -> please make sure your method is public or protected so it will be visible for ancestors
protected void doSpecificInitialization() {...}
@Test
public void doTests() {...}
}
그 결과 다음과 같은 일이 발생합니다.
- A.doInitialization()
- B.doSpecific Initialization()
- B.doTests()
내 경우(JUnit) 기본 클래스와 파생 클래스에 setup()이라는 동일한 메서드가 있습니다.이 경우 파생 클래스의 메서드만 호출되며 기본 클래스 메서드를 호출합니다.
상속을 사용하여 이를 실현하는 더 좋고 깨끗한 방법은 다음과 같습니다.
abstract class A {
@BeforeClass
void doInitialization() {}
}
class B extends A {
@Override
@BeforeClass
void doInitialization() {
super.doInitialization();
}
@Test
void doTests() {}
}
언급URL : https://stackoverflow.com/questions/2132734/beforeclass-and-inheritance-order-of-execution
'programing' 카테고리의 다른 글
Node.js에서 파일을 자동 새로고침하는 방법 (0) | 2022.09.04 |
---|---|
if(a - b < 0)와 if(a < b)의 차이 (0) | 2022.09.03 |
Android 아카이브 라이브러리(aar)와 표준 jar (0) | 2022.09.03 |
가변 매크로(변수 인수 수)를 만드는 방법 (0) | 2022.09.03 |
메이븐은 왜 그렇게 평판이 나쁜가요? (0) | 2022.09.03 |