๐Ÿšจ ์—๋Ÿฌ

[Spring/Test Code] Unnecessary stubbings detected, UnnecessaryStubbingException

kekeyo 2025. 6. 19. 21:18
728x90

๋ฌธ์ œ

@ParameterizedTest
@MethodSource("invalidCreatePostArgs")
void createPost_์˜ˆ์™ธ(
    Long userId,
    Long problemNumber,
    List<String> categories,
    Class<? extends RuntimeException> expectedException,
    ErrorMessage errorMessage) {

    PostCreateEditRequestDto requestDto = PostFixture.requestDto(problemNumber, categories, PostFixture.TEST_TITLE, PostFixture.TEST_CONTENT);

    // ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์‚ฌ์šฉ์ž ID๋ผ๋ฉด empty
    given(userRepository.findById(userId)).willReturn(
        userId.equals(VALID_USER_ID) ? Optional.of(user) : Optional.empty()
    );

    // ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๋ฒˆํ˜ธ๋ผ๋ฉด empty
    given(problemRepository.findByNumber(problemNumber)).willReturn(
        problemNumber.equals(VALID_PROBLEM_NUMBER) ? Optional.of(problem) : Optional.empty()
    );

    given(categoryRepository.findByNameIn(categories)).willReturn(List.of(category));

    assertThatThrownBy(() -> postService.createPost(userId, requestDto))
        .isInstanceOf(expectedException)
        .hasMessage(errorMessage.getMessage());
}

static Stream<Arguments> invalidCreatePostArgs() {
    return Stream.of(
        // ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์‚ฌ์šฉ์ž
        Arguments.of(INVALID_USER_ID, VALID_PROBLEM_NUMBER, VALID_CATEGORIES, ForbiddenException.class, ErrorMessage.USER_NOT_FOUND),

        // ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๋ฒˆํ˜ธ
        Arguments.of(VALID_USER_ID, INVALID_PROBLEM_NUMBER, VALID_CATEGORIES, BadRequestException.class, ErrorMessage.INVALID_PROBLEM_INCLUDED),

        // ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์นดํ…Œ๊ณ ๋ฆฌ
        Arguments.of(VALID_USER_ID, VALID_PROBLEM_NUMBER, INVALID_CATEGORIES, BadRequestException.class, ErrorMessage.INVALID_CATEGORY_INCLUDED)
    );
}

์—๋Ÿฌ๋ฉ”์„ธ์ง€

nnecessary stubbings detected.
Clean & maintainable test code requires zero unnecessary code.
Following stubbings are unnecessary (click to navigate to relevant line of code):
  1. -> at icet.koco.post.PostServiceTest$createPostTest.createPost_์˜ˆ์™ธ(PostServiceTest.java:154)
  2. -> at icet.koco.post.PostServiceTest$createPostTest.createPost_์˜ˆ์™ธ(PostServiceTest.java:158)
Please remove unnecessary stubbings or use 'lenient' strictness. More info: javadoc for UnnecessaryStubbingException class.

์›์ธ

์กด์žฌํ•˜์ง€ ์•Š๋Š” ์‚ฌ์šฉ์ž์˜ ๊ฒฝ์šฐ ์ฒซ๋ฒˆ์งธ given ๋•Œ error๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด์„œ ๋ฌธ์ œ ๋ฒˆํ˜ธ, ์นดํ…Œ๊ณ ๋ฆฌ ๊ด€๋ จ stub๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.

// userId๊ฐ€ INVALID_USER_ID์ธ ๊ฒฝ์šฐ
given(userRepository.findById(userId)) // โ† ์—ฌ๊ธฐ์„œ Optional.empty() ๋ฐ˜ํ™˜ โ†’ ์˜ˆ์™ธ ๋ฐœ์ƒ
// ์•„๋ž˜ ๋‘ given์€ ์‹คํ–‰๋˜์ง€ ์•Š์Œ
given(problemRepository.findByNumber(problemNumber))
given(categoryRepository.findByNameIn(categories))

์ด๋Ÿฌํ•  ๊ฒฝ์šฐ์— Mockito Core 3.x ๋ฒ„์ „์„ ์‚ฌ์šฉํ•  ๋•Œ ์œ„์™€ ๊ฐ™์ด UnnecessaryStubbingException ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.


ํ•ด๊ฒฐ

ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค์— ๋‹ค์Œ ์• ๋…ธํ…Œ์ด์…˜์„ ๋ถ™์—ฌ Mockito์˜ strict ๋ชจ๋“œ๋ฅผ ์™„ํ™”ํ•ด์ฃผ์—ˆ๋‹ค.

@MockitoSettings(strictness = Strictness.LENIENT)

728x90