[java] Junit-설정 방법을 한 번 실행

몇 가지 테스트로 클래스를 설정하고 사용하는 대신 @Before모든 테스트 전에 한 번만 실행되는 설정 메서드를 갖고 싶습니다. Junit 4.8에서 가능합니까?



답변

사용 @BeforeClass이 고전적인 솔루션 이라는 @assylias에 동의하지만 항상 편리한 것은 아닙니다. 주석이 달린 메서드 @BeforeClass는 정적이어야합니다. 테스트 케이스의 인스턴스가 필요한 일부 테스트의 경우 매우 불편합니다. 예를 들어 @Autowired스프링 컨텍스트에 정의 된 서비스와 함께 작동 하는 데 사용 하는 스프링 기반 테스트입니다 .

이 경우 개인적 setUp()으로 @Before주석이 달린 일반 메서드를 사용 하고 사용자 지정 static(!) boolean플래그를 관리합니다 .

private static boolean setUpIsDone = false;
.....
@Before
public void setUp() {
    if (setUpIsDone) {
        return;
    }
    // do the setup
    setUpIsDone = true;
}


답변

당신은 사용할 수 있습니다 주석 :BeforeClass

@BeforeClass
public static void setUpClass() {
    //executed only once, before the first test
}


답변

JUnit 5에는 이제 @BeforeAll 주석이 있습니다.

주석이 달린 메서드가 현재 클래스 또는 클래스 계층 구조의 모든 @Test 메서드보다 먼저 실행되어야 함을 나타냅니다. JUnit 4의 @BeforeClass와 유사합니다. 이러한 메서드는 정적이어야합니다.

JUnit 5의 라이프 사이클 주석이 마침내 제대로 된 것 같습니다! 보지 않고도 사용할 수있는 주석을 추측 할 수 있습니다 (예 : @BeforeEach @AfterAll).


답변

setUp()테스트 클래스의 슈퍼 클래스에 (예를 들어, AbstractTestBase다음과 같이 아래), 허용 대답을 수정할 수 있습니다 :

public abstract class AbstractTestBase {
    private static Class<? extends AbstractTestBase> testClass;
    .....
    public void setUp() {
        if (this.getClass().equals(testClass)) {
            return;
        }

        // do the setup - once per concrete test class
        .....
        testClass = this.getClass();
    }
}

이것은 하나의 비 정적 setUp()방법에 대해 작동 하지만 tearDown()복잡한 반사의 세계로 벗어나지 않고 는 동등한 것을 생산할 수 없습니다 … 현상금은 할 수있는 사람을 가리 킵니다!


답변

편집 :
디버깅하는 동안 모든 테스트 전에 클래스가 인스턴스화된다는 것을 알았습니다. @BeforeClass 주석이 여기에서 최고라고 생각합니다.

생성자에서도 설정할 수 있으며 테스트 클래스 결국 클래스 입니다 . 거의 모든 다른 방법에 주석이 달려 있기 때문에 이것이 나쁜 습관인지 확실하지 않지만 작동합니다. 다음과 같은 생성자를 만들 수 있습니다.

public UT () {
    // initialize once here
}
@Test
// Some test here...

ctor는 정적이 아니기 때문에 테스트 전에 호출됩니다.


답변

이 솔루션을 사용해보십시오 :
https://stackoverflow.com/a/46274919/907576 :

@BeforeAllMethods/ @AfterAllMethods주석 모든 주입 값을 사용할 수있는 인스턴스 환경에서 테스트 클래스의 모든 방법을 실행할 수 있습니다.


답변

내 더러운 해결책은 다음과 같습니다.

public class TestCaseExtended extends TestCase {

    private boolean isInitialized = false;
    private int serId;

    @Override
    public void setUp() throws Exception {
        super.setUp();
        if(!isInitialized) {
            loadSaveNewSerId();
            emptyTestResultsDirectory();
            isInitialized = true;
        }
    }

   ...

}

모든 testCases의 기본 기반으로 사용합니다.