memostack
article thumbnail
블로그를 이전하였습니다. 2023년 11월부터 https://bluemiv.github.io/에서 블로그를 운영하려고 합니다. 앞으로 해당 블로그의 댓글은 읽지 못할 수 도 있으니 양해바랍니다.
반응형

서비스 작성 MemberService.java

생성자 주입을 통해, MemberRepositoryBCryptPasswordEncoder를 주입한다.

BCryptPasswordEncoder는 시큐리티에 Bean을 생성했다. (아래 펼쳐서 확인)

더보기
@Configuration
@EnableWebSecurity
@EnableGlobalAuthentication
public class SecurityConfig extends WebSecurityConfigurerAdapter {

  /**
   * 비밀번호 암호화 인코딩 방식 정의
   *
   * @return BCryptPasswordEncoder BCrypt 단방향 암호화
   */
  @Bean
  public BCryptPasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
  }
  
  // ... 중략 ...
}
@Service
public class MemberService {

  private final MemberRepository memberRepository;

  private final BCryptPasswordEncoder passwordEncoder;

  public MemberService(MemberRepository memberRepository, BCryptPasswordEncoder passwordEncoder) {
    this.memberRepository = memberRepository;
    this.passwordEncoder = passwordEncoder;
  }

  /**
   * Member 를 insert 하는 메소드
   *
   * @param member 사용자 정보를 가지고 있는 Member 객체
   * @return Member 저장 완료된 사용자의 정보를 반환
   */
  public Member insertMember(Member member) {
    member
        .setActive(true) // 유저 활성화
        .setRegisterAt(LocalDateTime.now()) // 회원가입일
        .setPassword(passwordEncoder.encode(member.getPassword())); // 비밀번호 암호화
    return memberRepository.save(member);
  }
}

 

테스트 코드 작성 MemberServiceTest.java

참고

  • MemberRepository: 회원 데이터를 관리하는 Repository 객체
  • Member: 회원 정보를 담은 Entity 객체

 

MemberService에 생성자에 MemberRepositoryBCryptPasswordEncoder를 넣어준다.

@ExtendWith(MockitoExtension.class)
@DisplayName("MemberService 테스트")
class MemberServiceTest {

  @Mock private MemberRepository memberRepository;
  private BCryptPasswordEncoder passwordEncoder;
  private MemberService memberService;

  @BeforeEach
  void setUp() {
    this.passwordEncoder = new BCryptPasswordEncoder(); // 비밀번호 암호화를 위해..
    this.memberService = new MemberService(memberRepository, passwordEncoder);
  }
}

 

insert 하는 테스트 코드를 작성한다.

서비스에 대한 테스트를 하는 것이므로, RepositoryMock 객체로 생성한다.

@Test
@DisplayName("insert() 테스트")
void insetTest() {
  // given
  final LocalDateTime now = LocalDateTime.now();
  final Member member =
      Member.builder()
          .email("test@naver.com")
          .password("1234")
          .name("테스트 유저")
          .phone("010-1234-5678")
          .isActive(true)
          .registerAt(now)
          .build();
  given(memberRepository.save(member))
      .willReturn(
          Member.builder()
              .id(1L)
              .email("test@naver.com")
              .password(passwordEncoder.encode("1234"))
              .name("테스트 유저")
              .phone("010-1234-5678")
              .isActive(true)
              .registerAt(now)
              .build());

  // when
  final Member savedMember = memberService.insertMember(member);

  // then
  assertEquals(1L, savedMember.getId());
  assertEquals("test@naver.com", savedMember.getEmail());
  assertTrue(passwordEncoder.matches("1234", savedMember.getPassword()));
}

테스트 성공

 

나머지 select, update, delete 도 동일한 방법으로 테스트한다.

 


관련 글

2021/01/06 - [Spring/Spring Boot] - SpringBoot, Junit5에서 JPA Repository 테스트

 

SpringBoot, Junit5에서 JPA Repository 테스트

사전 준비 테스트를 위해, Entitiy와 Repository를 생성한다. Entity 생성 Role.java @Entity @Table(name = "role") @Getter @Builder @NoArgsConstructor @AllArgsConstructor(access = AccessLevel.PROTECTED)..

memostack.tistory.com

2021/01/15 - [Spring/Spring Boot] - SpringBoot, Junit5에서 REST API(Controller) 테스트

 

SpringBoot, Junit5에서 REST API(Controller) 테스트

REST API 테스트 Rest API를 테스트할 때는 @WebMvcTest 어노테이션을 사용한다. MockMvc 를 생성할때는 MockMvcBuilders 를 사용하여 생성한다. 다른 방법으로 MockMvcBuilders 를 사용하지 않고, MockMvc에 @Aut..

memostack.tistory.com

 

반응형
블로그를 이전하였습니다. 2023년 11월부터 https://bluemiv.github.io/에서 블로그를 운영하려고 합니다. 앞으로 해당 블로그의 댓글은 읽지 못할 수 도 있으니 양해바랍니다.
profile

memostack

@bluemiv_mm

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!