본 캠프_45일차

졸용·2025년 4월 20일

TIL

목록 보기
46/144

(4월21일)

도전 과제 시도 & 트러블슈팅

1️⃣ 도전 과제 시도

  1. 문제 인식 : 필수 기능 구현의 코드 개선 과정에서 의도치 않게 다른 부분의 개선? 가능한 부분을 발견할 수 있었다.

    맞는지 모르겠지만.. @InjectMock 어노테이션을 공부하다가, 의존성이 없는 클래스에 @InjectMock 어노테이션을 붙이면 테스트 코드가 제대로 동작하지 않을 수도 있다는 점을 발견하게 되었다.

  2. 해결 시도 (과정) : 코드 개선 수정을 시도해보았다.

PasswordEncoderTest 클래스에서 @InjectMock 어노테이션 대신에 @SpringBoot 어노테이션을 활용

PasswordEncoder 클래스가 @Component 으로 빈으로 등록되어 있기 때문에 @SpringBoot + @Autowired 어노테이션으로 빈 주입

성공적으로 수정하지 못 해서 다시 롤백했지만.. 이런 시도를 했었다..

package org.example.expert.config;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit.jupiter.SpringExtension;

import static org.junit.jupiter.api.Assertions.assertTrue;

@SpringBootTest
@ExtendWith(SpringExtension.class)
class PasswordEncoderTest {

    /*
    1. 의존성이 없는 클래스에 @InjectMock 어노테이션으로 주입할 것이 없다
    2. @Component 또는 @Configuration 으로 빈으로 등록된 클래스인 경우, 실제 스프링 빈으로 주입받기 때문에
       @SpringBoot + @Autowired 어노테이션을 사용해 실서비스 환경과 동일한 테스트 가능
     */
    @Autowired
    private PasswordEncoder passwordEncoder;
    /*
    스프링 빈이 아닌 그냥 일반 클래스일 경우 어노테이션으로 대체 불가
        → private PasswordEncoder passwordEncoder = new passwordEncoder();
     */

    @Test
    void matches_메서드가_정상적으로_동작한다() {
    
        // given
        String rawPassword = "testPassword";
        String encodedPassword = passwordEncoder.encode(rawPassword);

        // rawPassword, encodedPassword 파라미터 순서
        // when
        boolean matches = passwordEncoder.matches(rawPassword, encodedPassword);

        // then
        assertTrue(matches);
    }
}

2️⃣ 코드 개선 및 트러블슈팅

if (todo.getUser() == null) {
            throw new InvalidRequestException("담당자를 등록하려고 하는 유저가 일정을 만든 유저가 유효하지 않습니다.");
        }
        
        if (!ObjectUtils.nullSafeEquals(user.getId(), todo.getUser().getId())) {
            throw new InvalidRequestException("담당자를 등록하려고 하는 유저가 일정을 만든 유저가 유효하지 않습니다.");
        }

같은 예외처리를 throw 해주는 if문이 있기 때문에 중복문을 간략화해서 불필요한 부분을 수정해줬다.

if (todo.getUser() == null || !ObjectUtils.nullSafeEquals(user.getId(), todo.getUser().getId())) {
            throw new InvalidRequestException("담당자를 등록하려고 하는 유저가 일정을 만든 유저가 유효하지 않습니다.");
        }
profile
꾸준한 공부만이 답이다

0개의 댓글