๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿš€ ์šฐ์•„ํ•œํ…Œํฌ์ฝ”์Šค 6๊ธฐ ์ง€์› ๊ธฐ๋ก

[ํ”„๋ฆฌ์ฝ”์Šค] ํ”„๋ฆฌ์ฝ”์Šค 2์ฃผ์ฐจ ํ›„๊ธฐ (์ž๋™์ฐจ ๊ฒฝ์ฃผ ๐Ÿš—)

by dev_writer 2023. 11. 6.

๋‹ค์†Œ ๋Šฆ์€ ํ”„๋ฆฌ์ฝ”์Šค 2์ฃผ ์ฐจ ํ›„๊ธฐ๋ฅผ ์˜ฌ๋ฆฝ๋‹ˆ๋‹ค! ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ ๋ฏธ์…˜์ด ๊ฝค ๊ฑธ๋ฆฌ๋Š”์ง€๋ผ ์ด์ œ์•ผ ์˜ฌ๋ฆฌ๊ฒŒ ๋๋„ค์š” ๐Ÿฅฒ

 

์ด๋ฒˆ ๋ฏธ์…˜์€ ํ•™๊ต ์„ ๋ฐฐ ๋ถ„๊ป˜ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ›์œผ๋ฉฐ ๋ฏธ๋ฆฌ ํ•ด ๋ณธ ์ž๋™์ฐจ ๊ฒฝ์ฃผ ๋ฏธ์…˜์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— 1์ฃผ ์ฐจ ๋•Œ์ฒ˜๋Ÿผ ํ•ต์‹ฌ ๋กœ์ง์€ ์‰ฝ๊ฒŒ ์ดํ•ด๋˜์—ˆ์—ˆ์Šต๋‹ˆ๋‹ค.

JUnit5์— ๋Œ€ํ•ด ๊นŠ๊ฒŒ ํŒŒ๋ณด๊ฒŒ ๋จ (ParameterResolutionException)

์ด๋ฒˆ ๋ฏธ์…˜์—์„œ๋Š” ์š”๊ตฌ์‚ฌํ•ญ์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด ๋ณด๋ผ๋Š” ๊ฒƒ์ด ์•„์˜ˆ ์š”๊ตฌ์‚ฌํ•ญ์— ์ •์˜๋˜์–ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ์•„ํ•œ ํ…Œํฌ์ฝ”์Šค์˜ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ํ…Œ์ฝ”ํ†ก ์˜์ƒ์„ ๋ณด๋ฉฐ ์ œ๋Œ€๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์ตํ˜€๋ณด๊ณ  ์‹ถ์—ˆ๊ณ , ์ด ๊ณผ์ •์—์„œ @ParameterizedTest๋ฅผ ์“ฐ๋ฉด ๊ฐ™์€ ํ…Œ์ŠคํŠธ์ด๋ฉด์„œ ๋‹ค๋ฅธ ์ž…๋ ฅ๊ฐ’์„ ๊ฒ€์ฆํ•  ๊ฒฝ์šฐ๋ฅผ ์ถ•์•ฝํ•  ์ˆ˜ ์žˆ์Œ์„ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฐ๋ฐ ์šฐ์—ฐํžˆ @Test์™€ @ParameterizedTest๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ–ˆ์—ˆ๋Š”๋ฐ, ์ด ๊ณผ์ •์—์„œ ParameterResolutionException์ด๋ผ๋Š” ์˜ˆ์™ธ๋ฅผ ์ ‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋“ค์„ ํ•จ๊ป˜ ์“ฐ๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ž„์„ ์‰ฝ๊ฒŒ ์•Œ์•˜์ง€๋งŒ, ์™œ ์ •ํ™•ํžˆ ์ด๋Ÿฌํ•œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ์ธ์ง€๋ฅผ ์•Œ๊ณ  ์‹ถ์–ด JUnit์˜ ๋‚ด๋ถ€ ์ฝ”๋“œ๋ฅผ ๋””๋ฒ„๊น…ํ•ด ๋ณด๋ฉฐ ์›์ธ์„ ์ฐพ๊ณ ์ž ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ @Test์˜ ๊ฒฝ์šฐ์—์„œ๋Š” @ParameterizedTest์—์„œ ์‚ฌ์šฉํ•˜๋˜ ๊ฒƒ์ฒ˜๋Ÿผ String ํ˜•ํƒœ์˜ ์ธ์ž๊ฐ€ ์ฃผ์–ด์งˆ ๊ฒฝ์šฐ ์ง€์›๋˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฆฌ์กธ๋ฒ„๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•จ์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ด ๊ธ€์„ ์ฐธ๊ณ ํ•ด ์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค!

๋ ˆ์ฝ”๋“œ ๋„์ž…

์ €๋ฒˆ ์ฃผ์ฐจ ๋ฏธ์…˜์ธ ์ˆซ์ž ์•ผ๊ตฌ์—์„œ๋Š” DTO๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๊ดœ์ฐฎ์„ ๊ฒƒ ๊ฐ™์•„ ์•„์˜ˆ ์ž‘์„ฑํ•˜์ง€ ์•Š์•˜์—ˆ์ง€๋งŒ, ์ด๋ฒˆ ์ž๋™์ฐจ ๊ฒฝ์ฃผ ๋ฏธ์…˜ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ๋งค๋ฒˆ ์ž๋™์ฐจ์˜ ๊ฐ ํ˜„ํ™ฉ์„ ๋ณด์—ฌ์ฃผ์–ด์•ผ ํ•ด์„œ DTO๋ฅผ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋˜ ๋„์ค‘ ์ž๋ฐ” 17์˜ ํŠน์ง•์ธ ๋ ˆ์ฝ”๋“œ๋Š” ๋ฌด์—‡์ธ์ง€ ๋ฌธ๋“ ๊ถ๊ธˆ์ฆ์ด ๋“ค์—ˆ๊ณ , ๋ง‰์ƒ ๊ฐœ๋…์„ ์ ‘ํ•˜๋‹ˆ ๊ธฐ์กด์— ์ง์ ‘ ์ž‘์„ฑํ•˜๋˜ DTO๋ฅผ ์‰ฝ๊ฒŒ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค๊ณ  ํŒ๋‹จ๋˜์–ด DTO ์ฝ”๋“œ๋ฅผ ๋ ˆ์ฝ”๋“œ๋กœ ๋ฐ”๊ฟจ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๋“ฏ ์ž๋ฐ” ๋ฒ„์ „์— ๋”ฐ๋ผ ์ง€์› ๊ฐ€๋Šฅํ•œ ๊ฐœ๋…๋“ค์ด ์žˆ๊ธฐ์—, ๊ทธ๋™์•ˆ ์ž๋ฐ” ๋ฒ„์ „์— ๋Œ€ํ•ด ํฌ๊ฒŒ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๋˜ ๊ฒŒ ์–ผ๋งˆ๋‚˜ ์ข‹์ง€ ์•Š์€์ง€๋ฅผ ๋Š๊ผˆ๊ณ  ์•ž์œผ๋กœ๋Š” ํ”„๋กœ๊ทธ๋žจ์— ์‚ฌ์šฉ๋˜๋Š” ๋ฒ„์ „์— ๋”ฐ๋ผ์„œ ์–ด๋–ค ๊ฒƒ๋“ค์„ ์“ธ ์ˆ˜ ์žˆ์„์ง€ ๋ฏธ๋ฆฌ ์กฐ์‚ฌํ•ด ๋ด์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ๊ฐ€์ง€๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•œ ๊ธ€์€ ์ด ๊ธ€์„ ์ฐธ๊ณ ํ•ด ์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

JUnit์˜ Assertions ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•ด ๋” ์•Œ๊ฒŒ ๋จ

์ˆซ์ž ์•ผ๊ตฌ ๋ฏธ์…˜์—์„œ๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ ์‹œ, ์˜ˆ์™ธ ๋ฐœ์ƒ๊ณผ ์ •์ƒ ์ฝ”๋“œ๋ฅผ ์•„๋ž˜์ฒ˜๋Ÿผ ์ž‘์„ฑํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค.

@Test
void ํ”Œ๋ ˆ์ด_์ˆซ์ž๋Š”_์ค‘๋ณต๋˜๋ฉด_์•ˆ๋œ๋‹ค() {
    // given & when
    Throwable exception = Assertions.assertThrows(IllegalArgumentException.class, () -> {
        PlayNumber playNumber = PlayNumber.from("111");
    });
    // then
    assertThat(exception.getMessage()).isEqualTo(PLAY_NUMBER_DUPLICATE_EXCEPTION.toString());
 }

@Test
void ์„ธ์ž๋ฆฌ_๋ชจ๋‘_์ •์ƒ์ด๋ผ๋ฉด_๋ฌธ์ œ์—†์ด_์ƒ์„ฑ๋œ๋‹ค() {
    PlayNumber playNumber = PlayNumber.from("123");
}

 

Assertions ๋ฉ”์„œ๋“œ๋“ค์„ ๋” ์ฐพ์•„๋ณด๋‹ˆ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ ์ ˆํ•œ ๋ฉ”์„œ๋“œ๋“ค์„ ์ฐพ์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

  • org.assertj.core.api.Assertions.assertThatThrownBy: ํŠน์ • ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์˜ˆ์™ธ ๋ฉ”์‹œ์ง€๊ฐ€ ํŠน์ • ๋ฉ”์‹œ์ง€๊ฐ€ ๋งž๋Š”์ง€ ๋“ฑ์„ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • org.junit.jupiter.api.Assertions.assertDoesNotThrow: ์˜ˆ์™ธ๊ฐ€ ํ„ฐ์ง€์ง€ ์•Š๊ณ  ์ •์ƒ์ ์œผ๋กœ ์ง„ํ–‰์ด ๋˜๋Š”์ง€์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ดํ›„ ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.

@Test
@DisplayName("์ด๋ฆ„์ด ๋ชจ๋‘ ๋…๋ฆฝ์ ์ด๋ฉด ์ •์ƒ ์ƒ์„ฑ๋œ๋‹ค.")
void splitNamesTest() {
    // when & then
    assertDoesNotThrow(() -> Names.from("john,bob,alice"));
}

@Test
@DisplayName("๊ฐ™์€ ์ด๋ฆ„์ด ๋ฐœ๊ฒฌ๋˜๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.")
void duplicateNamesExceptionTest() {
    // when & then
    assertThatThrownBy(() -> Names.from("john,john,bob")).isInstanceOf(IllegalArgumentException.class)
            .hasMessage(DUPLICATE_NAME_EXCEPTION.getMessage());
}

 

  • assertDoesNotThrow๋ฅผ ํ†ตํ•ด ํ™•์‹คํžˆ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰์ด ๋˜๋Š”์ง€ ๊ฒ€์ฆ์˜ ์˜๋ฏธ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • assertThatThrownBy๋ฅผ ํ†ตํ•ด ๊ฒ€์ฆ ๊ณผ์ •์„ ํ•œ ๋ฒˆ์— ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ Assertions์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฉ”์„œ๋“œ๋“ค์„ ํ™œ์šฉํ•˜๋‹ˆ ๋” ์ง๊ด€์ ์ด๊ณ  ๊ฒ€์ฆ์˜ ์˜๋ฏธ๋ฅผ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ์–ด ํ•œ ์ธต ๋” ์ข‹์•„์ง„ ์ฝ”๋“œ์ž„์„ ๋Š๊ผˆ์Šต๋‹ˆ๋‹ค.

Assertions์— ๊ด€ํ•ด์„œ๋Š” ๋‹ค๋ฅธ ๊ธ€์—์„œ ๋” ์ •๋ฆฌํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ชจํ˜ธํ•œ ์š”๊ตฌ์‚ฌํ•ญ์— ๋Œ€ํ•œ ๊ณ ๋ฏผ

์ฝ”์น˜์™€์˜ ์ˆ˜๋‹ค ํƒ€์ž„ (์ฝ”์ˆ˜ํƒ€) ๋•Œ ์ด๋Ÿฐ ๋ง์”€์„ ํ•ด์ฃผ์…จ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ๊ฐœ๋ฐœ์— ํˆฌ์ž…๋˜๋ฉด ์‹ฌํ•œ ๊ฒฝ์šฐ์—๋Š” ๊ธฐํš๊ณผ ๊ฐœ๋ฐœ์ด ๋™์‹œ์— ์ผ์–ด๋‚˜๊ธฐ๋„ ํ•œ๋‹ค.
์šฐ๋ฆฌ๊ฐ€ ๊น€์น˜๋ณถ์Œ๋ฐฅ์„ ์š”๋ฆฌํ•  ๋•Œ ๊น€์น˜๋ฅผ ์ •ํ™•ํžˆ ์–ผ๋งˆ๋‚˜, ๊ณ ์ถง๊ฐ€๋ฃจ๋ฅผ ์ •ํ™•ํžˆ ์–ผ๋งˆ๋‚˜ ๋„ฃ์„์ง€๋Š” ๊ณ ๋ คํ•˜์ง€ ์•Š๋Š”๋‹ค.
์ด๋Ÿฌํ•œ ๊ณผ์ •์— ๋Œ€ํ•ด์„œ๋„ ์—ฐ์Šตํ•ด ๋ณด๊ธธ ๊ถŒํ•œ๋‹ค.

 

์œ„ ๋ง์”€์ฒ˜๋Ÿผ, ๊ทธ๋™์•ˆ ์ง„ํ–‰ํ–ˆ๋˜ ํ”„๋กœ์ ํŠธ๋“ค์—์„œ๋„ ์ด๋ ‡๊ฒŒ ๊ธฐํš๊ณผ ๋™์‹œ์— ๊ฐœ๋ฐœ์„ ํ•ด์•ผ ํ–ˆ๋˜ ์ ์ด ์žˆ๊ณค ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

์ž๋™์ฐจ ๊ฒฝ์ฃผ ๋ฏธ์…˜์˜ ๊ฒฝ์šฐ์—๋„ ์ž๋™์ฐจ์˜ ์ด๋ฆ„์„ ์ž…๋ ฅ๋ฐ›์„ ๋•Œ 5์ž ์ดํ•˜์ธ ๊ฒƒ๋งŒ ์กฐ๊ฑด์œผ๋กœ ๋˜์–ด ์žˆ์–ด์„œ, ๊ณต๋ฐฑ์ด ํฌํ•จ๋ผ๋„ ๋˜๋Š”์ง€, ์ˆซ์ž๊ฐ€ ๋“ค์–ด๊ฐ€๋„ ๋˜๋Š”์ง€์™€ ๊ฐ™์€ ์„ธ๋ถ€์ ์ธ ์˜ˆ์™ธ์‚ฌํ•ญ์— ๋Œ€ํ•ด์„œ๋Š” ๊ธฐ์ˆ ํ•ด๋‘์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์•„์˜ˆ ํšŒ์‚ฌ์—์„œ ์‹ค์ œ๋กœ ์ด ๋ฏธ์…˜์„ ๊ฐœ๋ฐœํ•ด์•ผ ํ•œ๋‹ค๋ฉด ๋‚ด๋ถ€์ ์œผ๋กœ ์ด๋Ÿฌํ•œ ๋…ผ์˜๋“ค์ด ์ด๋ฏธ ์ง„ํ–‰๋๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ , ์ œ ๋‚˜๋ฆ„์˜ ๊ธฐ์ค€์„ ์„ธ์›Œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•ด ๋‘์—ˆ์Šต๋‹ˆ๋‹ค.

 

ํ”„๋ฆฌ์ฝ”์Šค๋„ ๊ทธ๋ ‡๊ณ  ์‹ค์ œ ๊ฐœ๋ฐœ๋„ ๊ทธ๋ ‡๊ณ  ์‹œ๊ฐ„์ด ์ง€๋‚ ์ˆ˜๋ก, ๋˜๋Š” ๋•Œ๋กœ๋Š” ์ด๋ ‡๊ฒŒ ๋ชจํ˜ธํ•œ ์š”๊ตฌ์‚ฌํ•ญ๋“ค์ด ๋” ๋งŽ์€ ๊ฒŒ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ์ ์—์„œ ์ด๋Ÿฌํ•œ ๊ณ ๋ฏผ์„ ๋ฏธ๋ฆฌ ํ•ด ๋ณผ ์ˆ˜ ์žˆ์—ˆ๋‹ค๋Š” ์ ์—์„œ, ๋งŽ์€ ๊ฒƒ์„ ๋ฐฐ์šด ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.


๊ฒฐ๋ก 

์ €๋ฒˆ ์ฃผ์ฐจ์—๋Š” ๊ตฌ์กฐ์ ์ธ ๊ฒƒ์— ๋Œ€ํ•ด ๊ณ ๋ฏผ์„ ํ–ˆ์—ˆ๋‹ค๋ฉด, ์ด๋ฒˆ ์ฃผ์—๋Š” ๊ธฐ์ˆ ์— ๊ด€ํ•ด ๊ณ ๋ฏผ์„ ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ํ”„๋ฆฌ์ฝ”์Šค ๋ฏธ์…˜์—์„œ๋„ ๋” ๋งŽ์€ ๊ฒƒ์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์œผ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค ๐Ÿ˜ƒ


์ตœ์ข… ์ œ์ถœ

์ด๊ณณ์—์„œ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.