(4월21일)
문제 인식 : 필수 기능 구현의 코드 개선 과정에서 의도치 않게 다른 부분의 개선? 가능한 부분을 발견할 수 있었다.
맞는지 모르겠지만.. @InjectMock 어노테이션을 공부하다가, 의존성이 없는 클래스에 @InjectMock 어노테이션을 붙이면 테스트 코드가 제대로 동작하지 않을 수도 있다는 점을 발견하게 되었다.
해결 시도 (과정) : 코드 개선 수정을 시도해보았다.
→ 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);
}
}
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("담당자를 등록하려고 하는 유저가 일정을 만든 유저가 유효하지 않습니다.");
}