Junit 에서는 Non-Daemon Thread 가 살아 있어도 프로세스는 종료된다.

식빵·2022년 6월 20일
0

Java Lab

목록 보기
7/21
post-thumbnail

자바 쓰레드를 배운 사람들이라면 아래 코드가 2초 이후에 프로세스가 종료된다는 것을 알 것이다.

package hello;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class MainMethodUserThreadTest {
    public static void main(String[] args) {

        new Thread(() -> {
            try {
                log.info("2 second wait start!");
                Thread.sleep(2000);
                log.info("2 second wait done!");
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }).start();

        log.info("main End!");
    }
}

그리고 아래 코드는 데몬 쓰레드를 사용해서, 2초를 기다리지 않고
메인 쓰레드가 할 일을 끝내면 프로세스가 곧바로 종료된다는 것도 알 것이다.

package hello;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class MainMethodUserThreadTest {
    public static void main(String[] args) {

        Thread thread = new Thread(() -> {
            try {
                log.info("2 second wait start!");
                Thread.sleep(2000);
                log.info("2 second wait done!");
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        });
        thread.setDaemon(true);
        thread.start();

        log.info("main End!");
    }
}

너무나도 당연한 결과다.
그런데 위 코드와 비슷하게 짠 코드를 Junit 에서 돌리면 어떨까?

package hello;

import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;

@Slf4j
public class JunitMethodUserThreadTest {
    @Test
    void userThreadAliveTest() {
        Thread thread = new Thread(() -> {
            try {
                log.info("2 second wait start!");
                Thread.sleep(2000);
                log.info("2 second wait done!");
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        });
        thread.start();
        log.info("main End!");
    }

}

실제 실행결과는 아래와 같다.


데몬쓰레드 설정을 한 것도 아닌데, 프로세스가 2초가 되기도 전에 끝나버린다!



처음에는 진짜로 "나 쓰레드 잘못 배웠나?"했다.
하지만 다행히 그게 아니였다!
검색 결과 이 글을 발견하게 되었다.
글의 내용을 요약하자면 아래와 같다.

  • 일반적인 main 메소드와, junit @Test 메소드에서 동작의 차이가 있다.
  • junit 에서는 user thread 가 계속 동작하든 말든 그냥 테스트 코드가 쭉 다 읽히면 끝나는 걸로 간주하고 jvm 자체를 종료시키버린다.

그렇다! Junit 테스트 환경의 특성 때문에 발생한 일인 것이다!
오늘도 지식 +1!

profile
백엔드를 계속 배우고 있는 개발자입니다 😊

0개의 댓글