programing

@BeforeClass 및 상속 - 실행 순서

yoursource 2022. 9. 3. 17:19
반응형

@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는 이미 시행된 것 같습니다.

는 ㅇㅇㅇㅇㅇㅇㅇㅇ다를 넣었습니다.publicdoTests. 는 되지 않습니다 Test NGdoInitialization()publicA★★★★★★★★★★★★★★★★★★★★★★★★★」

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

반응형