[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 메서드는 현재 클래스보다 먼저 실행됩니다.”

그러나 같은 이름으로 두 메서드의 이름을 지정하지 않도록주의 하십시오 . 이 경우 부모 메서드는 자식 부모에 의해 숨겨집니다. 소스 .