Spring/Test

태태개발일지 - Service 계층 Test

태태코 2024. 6. 9. 17:35
반응형

 

단위별 테스트 작성

 

저번 글과 이어서 이번에는 Service 계층에 테스트를 진행시켜보도록 하겠다.

 

package com.example.service.prag.user.service;

import com.example.service.prag.user.domain.User;
import com.example.service.prag.user.domain.UserRepository;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.when;

@ExtendWith(MockitoExtension.class)
class UserServiceTest {
    @Mock
    private UserRepository userRepository;

    @InjectMocks
    private UserService userService;

    @Test
    public void findUserByEmail(){

        User user = User.builder()
                .userName("Taehwan")  // user_name 필드 추가
                .userEmail("Taehwan@gmail.com")  // user_email 필드 추가
                .userPassword("password")  // user_password 필드 추가
                .build();

    }


    @Test
    public void findUserByEmai2() {
        // 테스트할 사용자 객체 생성
        User user = User.builder()
                .userName("Taehwan")
                .userEmail("Taehwan@gmail.com")
                .userPassword("password")
                .build();

        // userRepository.findByUserEmail 호출 시 반환값 설정
        when(userRepository.findByUserEmail("Taehwan@gmail.com")).thenReturn(user);

        // 서비스 메서드 호출
        User foundUser = userService.findByUserEmail("Taehwan@gmail.com");

        // 검증
        assertNotNull(foundUser);
        assertEquals("Taehwan", foundUser.getUserName());
        assertEquals("Taehwan@gmail.com", foundUser.getUserEmail());
        assertEquals("password", foundUser.getUserPassword());

        // userRepository.findByUserEmail 메서드가 한 번 호출되었는지 검증
        verify(userRepository, times(1)).findByUserEmail("Taehwan@gmail.com");
    }

    @Test
    public void findByUserNameAndCreatedAtTest(){
        User user = User.builder()
                .userName("Taehwan")
                .userEmail("Taehwan@gmail.com")
                .userPassword("password")
                .build();

        User user2 = User.builder()
                .userName("Taehwan")
                .userEmail("Taehwan2@gmail.com")
                .userPassword("password2")
                .build();

        List<User> users = List.of(user2,user);
        String name = "Taehwan";
        LocalDateTime createdAt=LocalDateTime.now();

        when(userRepository.findByUserNameAndCreatedAt(name,createdAt)).thenReturn(users);

        List<User> result = userService.findByUserNameAndCreatedAt(name,createdAt);

        assertNotNull(result);
        assertEquals("Taehwan", result.get(0).getUserName());
//        assertEquals("Taehwan@gmail.com", result.get(0).getUserEmail());
        // userRepository.findByUserEmail 메서드가 한 번 호출되었는지 검증
        verify(userRepository, times(1)).findByUserNameAndCreatedAt(name,createdAt);
    }
}

 

 

저번 Repository테스트와 다르게 이번에는 

@ExtendWith(MockitoExtension.class)

 

이 구문과

@Mock
private UserRepository userRepository;

@InjectMocks
private UserService userService;

 

Mock의 개념이 들어가는데 이것은 하나의 계층에서 다른 계층의 의존성을 Mock 가짜 객체로 변환시켜서 단일의 기능을 테스트하기 위함이다.

 

테스트의 로직은 비슷하지만, 

when(userRepository.findByUserEmail("Taehwan@gmail.com")).thenReturn(user);

 

아래와 같이 when을 통해서 Mock객체가 어떤 메서드를 어떤 매개변수를 통해서 실행했는지를 확인하고, 결과 값을 미리 만들어서 thenReturn에 넣어주면

 

userRepository가 실제 동작하는 것처럼 결과를 예측할 수 있다.

 

User foundUser = userService.findByUserEmail("Taehwan@gmail.com");

// 검증
assertNotNull(foundUser);
assertEquals("Taehwan", foundUser.getUserName());
assertEquals("Taehwan@gmail.com", foundUser.getUserEmail());
assertEquals("password", foundUser.getUserPassword());



그 동작한 결과와 비교를 하여 service의 메서드를 실행시켜 결과를 확인한다.

 

verify(userRepository, times(1)).findByUserEmail("Taehwan@gmail.com");


실제 메서드가 몇번 호출되었는지 확인할 수 있다.

반응형

'Spring > Test' 카테고리의 다른 글

태태개발일지 - Controller계층 Test  (0) 2024.06.09
태태개발일지 -TestCode 편  (0) 2024.06.09