@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
class StudyTest {
int value = 1;
@FastTest
@Test
@DisplayName("스터디 만들기 ╯°□°)╯ fast")
void create_new_study() {
System.out.println(value++);
Study actual = new Study(10);
assertEquals(actual.getLimit(), 10);
assertThat(actual.getLimit()).isGreaterThan(0);
}
@SlowTest
@DisplayName("스터디 만들기 \uD83D\uDe31 slow")
@Test
void create_new_study_again() {
System.out.println(value++);
System.out.println("create1");
}
위와 같이 코드가 짜여있습니다.
int value = 1; 로 전역변수를 만들어 놓고
첫번째 테스트 메소드에서System.out.println(value++) 하여 증가 시키고 두번째 테스트 메소드에서도 증가 시켰습니다.
기대하는건 value의 값 변화인데 어느 메소드에서 출력해도 값은 1로 같습니다.
![[JUnit5] 테스트 인스턴스 [JUnit5] 테스트 인스턴스](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
![[JUnit5] 테스트 인스턴스 [JUnit5] 테스트 인스턴스](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
왜냐하면 JUnit은 기본 전략은 테스트 메소드마다 StudyTest라는 인스턴스를 생성합니다.
@FastTest
@Test
@DisplayName("스터디 만들기 ╯°□°)╯ fast")
void create_new_study() {
System.out.println(this);
System.out.println(value++);
Study actual = new Study(10);
assertEquals(actual.getLimit(), 10);
assertThat(actual.getLimit()).isGreaterThan(0);
}
@SlowTest
@DisplayName("스터디 만들기 \uD83D\uDe31 slow")
@Test
void create_new_study_again() {
System.out.println(this);
System.out.println(value++);
System.out.println("create1");
}
이렇게 this 를 출력해보면
![[JUnit5] 테스트 인스턴스 [JUnit5] 테스트 인스턴스](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
![[JUnit5] 테스트 인스턴스 [JUnit5] 테스트 인스턴스](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
다른 해쉬 값이 나와 다른 인스터스인것을 확인 할 수 있습니다.
이것이 왜 그런것이냐면 테스트간의 의존성을 없애기 위해서입니다.
테스트의 순서에따라 테스트가 깨지는 상황이 나올 수 도 있습니다.
같은 인스턴스를 공유하게 하는 방법도 있습니다.
@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class StudyTest {
@TestInstance 를 사용하여 Lifecycle.PER_CLASS 로 잡아주면 됩니다.
그리고 @TestInstance를 사용하였을때는
@BeforeAll , @AfterAll 의 메소드는 static일 필요가 없어집니다.
생각해보면 당연합니다.
테스트메소드 마다 새로운 인스턴스가 생길때 @BeforeAll , @AfterAll 가 붙은 메소드는 항상 실행되는데 static 이 아니면 이것도 새로운 인스턴스가 생겨서 테스트가 깨질수도 있습니다. 그래서 static을 붙이는건데 @TestInstance을 사용하면 인스턴스가 하나만 생성되기 때문에 static일 필요가 없어집니다.
'Spring Boot > JUnit5' 카테고리의 다른 글
[Junit5] junit-platform.properties (0) | 2022.07.22 |
---|---|
[JUnit5] 테스트 순서 (0) | 2022.07.22 |
[JUint5] 테스트 반복하기 (0) | 2022.07.22 |
[JUnit5] Assumptions (0) | 2022.07.21 |
[JUnit5] Assertion (0) | 2022.07.21 |
댓글