TestCode

Junit4 와 Junit5의 아주 간략한 차이

challnum 2024. 4. 20. 22:15

TestCode를 이용해서 동시성 문제를 사용해보려다 생긴 모두가 알법한 아주 간단한 이슈를 정리합니다.

 

기존의 Junit4에서의 TestCode는 아래와 같은 식으로 작성을 했었다. 내용을 보면 @RunWith, @After 어노테이션을 사용하고 있다.

@RunWith(SpringRunner.class)
@SpringBootTest
public class PostsRepositoryTest {

    @Autowired
    PostsRepository postsRepository;

    @After
    public void cleanup() {
        postsRepository.deleteAll();
    }

    @Test
    public void 게시글저장_불러오기() {
        //given
        String title = "테스트 게시글";
        String content = "테스트 본문";

        postsRepository.save(Posts.builder()
                .title(title)
                .content(content)
                .author("jojoldu@gmail.com")
                .build());

        //when
        List<Posts> postsList = postsRepository.findAll();

        //then
        Posts posts = postsList.get(0);
        assertThat(posts.getTitle()).isEqualTo(title);
        assertThat(posts.getContent()).isEqualTo(content);
    }

 

하지만 나는 새롭게 테스트 하는 내용의 경우 아래와 같이 @BeforeEach, @AfterEach 어노테이션과 assertEquals를 사용하려고 했었다. 

@SpringBootTest
public class StockServiceTest {

    @Autowired
    private StockService stockService;

    @Autowired
    private StockRepository stockRepository;

    @BeforeEach
    public void before(){
        stockRepository.saveAndFlush(new Stock(1L, 100L));
    }
    @AfterEach
    public void after(){
        stockRepository.deleteAll();
    }

    @Test
    public void 재고감소(){
        stockService.decrease(1L, 1L);

        Stock stock = stockRepository.findById(1L).orElseThrow();
        
        assertEquals(99, stock.getQuantity());
    }
}

 

하지만 그 과정에서

아래와 같은 NullPointExection이 발생했습니다. 그 말은 테스트 하기 전에 @AfterEach 어노테이션으로 값을 넣어주었는데 이 부분이 생략되었다는 말이며 기존의 Junit4에 맞게 작성된 코드는 잘 동작했으니 이 부분은 버전의 문제라고 볼 수 있습니다.

 

java.lang.NullPointerException at com.shop.mikor.service.StockServiceTest.재고감소(StockServiceTest.java:32)

 

그렇기에 Junit4 와 Junit5의 지원하는 기능의 차이를 보게 되면 아래와 같이 변경된 것을 알 수 있습니다.

 

 

출처 : https://jade314.tistory.com/entry/Junit-5