JUnit5 ์‚ฌ์šฉ๊ธฐ

Junit5 ์‚ฌ์šฉ๊ธฐ

JUnit5์˜ ์ƒˆ๋กœ์šด ๊ฒƒ๋“ค ํ˜น์€ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋“ค์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž.

@ParameterizedTest

@Test๋Œ€์‹ ์— @ParameterizedTest ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฑด๋ฐ, ๋„๋Œ€์ฒด ์–ธ์ œ ์‚ฌ์šฉํ• ๊นŒ? ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’์„ ๋‹ค์–‘ํ•˜๊ฒŒ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•œ๋‹ค.

public class Numbers {
    public static boolean isEven(final int number) {
        return number % 2 == 0;
    }
}

์ง์ˆ˜์ธ์ง€๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” isEven ์ •์  ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ ๋‹ค.

    @ParameterizedTest
    @ValueSource(ints = {2,4,6,8,9, Integer.MAX_VALUE})
    void isEven(int number) {
        assertTrue(Numbers.isEven(number));
    }

๋‹ค์Œ๊ณผ ๊ฐ™์ด @ValueSource๋ฅผ ๊ฒ€์‚ฌํ•˜๊ณ ์ž ํ•˜๋Š” ์ธ์ž์˜ ๊ฐ’์„ ๋ฐฐ์—ด์— ๋‹ด์•„์„œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ๋Œ๋ฆฌ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. @ValueSource์— ๋‹ด์€ ํŒŒ๋ผ๋ฏธํ„ฐ ํ•˜๋‚˜ํ•˜๋‚˜๋ฅผ Junit์ด ์ง์ ‘ ํ…Œ์ŠคํŠธ๋ฅผ ์ „๋ถ€ ๋‹ค ํ•œ๋‹ค. ๐Ÿ‘

๋˜ํ•œ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋†ˆ๋“ค๊ณผ @ParameterizedTest๋ž‘ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ์˜ Null๊ณผ Empty์ธ ๊ฒฝ์šฐ์—๋„ ๋งค๋ฒˆ ๋”ฐ๋กœ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

@DisplayName

Junit4์—์„œ๋Š” ๋ฉ”์„œ๋“œ์— ํ•œ๊ธ€ ์ด๋ฆ„์„ ๋„ฃ์–ด์„œ ํ…Œ์ŠคํŠธ ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋ดค๋‹ค. ์ด๊ฒŒ ์˜๊ฒฌ์ด ๋ถ„๋ถ„ํ•ด์„œ ๋ˆ„๊ตฐ๊ฐ€๋Š” ํ…Œ์ŠคํŠธ๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ž˜ ํ’ˆ๊ณ  ์žˆ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•œ๊ตญ์ธ ๊ฐœ๋ฐœ์ž๋ผ๋ฆฌ ์ผํ•˜๋Š” ์ƒํ™ฉ์ด๋ฉด ๊ดœ์ฐฎ๋‹ค๊ณ  ํ•˜๋Š” ๋ถ„๋“ค๋„ ์žˆ๊ณ , ์ ˆ๋Œ€์ ์œผ๋กœ ๋ฉ”์„œ๋“œ๋ฅผ ํ•œ๊ธ€๋กœ ์“ฐ๋Š” ๊ฒƒ์„ ์šฉ๋ƒกํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ถ„๋“ค๋„ ๋ดค๋‹ค. ์•„๋ฌดํŠผ ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ @DisplayName์„ ํ†ตํ•ด์„œ ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ์ •ํ™•ํžˆ ๋ฌด์Šจ ์ผ์„ ํ•˜๋Š” ์ง€ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ๋‹ค.

    @DisplayName("์ง์ˆ˜ ํ…Œ์ŠคํŠธ")
    @ParameterizedTest
    @ValueSource(ints = {2,4,6,8,9, Integer.MAX_VALUE})
    void isEven(int number) {
        assertTrue(Numbers.isEven(number));
    }

@BeforeAll, @BeforeEach, @AfterAll, @AfterEach

๊ฐ๊ฐ Junit4์—์„œ ์‚ฌ์šฉํ•˜๋˜ ์–ด๋…ธํ…Œ์ด์…˜๋ช…์ด ๋ณ€ํ–ˆ๋‹ค.

Exception Test

์ด๋ฒˆ์—๋Š” ์ฒ˜์Œ ์ง์ˆ˜์ธ์ง€๋ฅผ ๊ฒ€์ฆํ•˜๋Š” ๋ฉ”์„œ๋“œ์— ๊ธฐ๋Šฅ์„ ํ•˜๋‚˜ ์ถ”๊ฐ€ ํ•ด๋ณด์ž.

    public static boolean isEven(final int number) {
        if (number < 0) {
            throw new IllegalArgumentException();
        }
        return number % 2 == 0;
    }

0๋ณด๋‹ค ์ž‘์€ ๊ฐ’์ด ๋“ค์–ด์˜จ ๊ฒฝ์šฐ์— IllegalArgumentException๋ฅผ ๋ฐœ์ƒ ์‹œํ‚จ๋‹ค.

    @DisplayName("์ง์ˆ˜ ํ…Œ์ŠคํŠธ: ์Œ์ˆ˜๊ฐ’์ธ ๊ฒฝ์šฐ์— ์˜ˆ์™ธ ๋ฐœ์ƒ")
    @ParameterizedTest
    @ValueSource(ints = {-1, -2})
    void isEven_negative_test(int number) {
        assertThatExceptionOfType(IllegalArgumentException.class)
                .isThrownBy(() -> Numbers.isEven(number));
    }

์—ญ์‹œ๋‚˜ @ParameterizedTest์™€ assertThatExceptionOfType์„ ํ™œ์šฉํ•œ๋‹ค. ๋ฐœ์ƒํ•  exceptionํด๋ž˜์Šค๋ฅผ ์ ๊ณ  ๋ˆ„๊ตฌ์— ์˜ํ•ด์„œ ๋˜์ ธ์ง€๋Š”์ง€(isThrownBy)๋ฅผ ๋ช…์‹œํ•œ๋‹ค. ๋‹ค๋งŒ ํ•ด๋‹น ๋ฉ”์„œ๋“œ์˜ ์ธ์ž๋Š” ThrowingCallable ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋žŒ๋‹คํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•ด ์ค€๋‹ค.

์ •๋ฆฌ

์•„์ฃผ ๊ฐ„๋‹จํ•œ Junit ํ…Œ์ŠคํŠธ use case๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค. ๋” ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ณ , ๊ณ ๋ฏผ ํ•˜๊ณ  ๋‹ค์‹œ ํฌ์ŠคํŒ…์„ ํ•ด์•ผ ๊ฒ ๋‹ค.

์—ฐ๊ด€ ํฌ์ŠคํŠธ