본문 바로가기
Development/Java

Spring Boot Test Case 작성에 대한 생각 - Service Test

by 폴피드 2021. 2. 17.
728x90
반응형

 

2021/02/17 - [Development/Java] - Spring Boot Test Case 작성에 대한 생각 - Repository Test

지난 글에 이어 이번에는 Service 테스트에 대해서 적어보려 한다. 아래는 내가 작성한  UserService  에 대한 테스트케이스 이다.

@RunWith(MockitoJUnitRunner.class)
public class UserServiceTest {


    private UserService userService;

    @Mock
    private UserRepository userRepository;

    private Users user1;

    @Before
    public void setup(){

        userService = new UserService(userRepository);

        user1 = Users.builder()
                .email("test01@test.com")
                .name("test01")
                .status(UserStatus.APPLIED)
                .build();
    }

    @Test
    public void findUserById(){
        when(userRepository.findById("test01@test.com")).thenReturn(Optional.of(user1));
        Users user = userService.findUserById("test01@test.com");

        verify(userRepository).findById("test01@test.com");
        Assert.assertNotNull(user);
        Assert.assertEquals("test01@test.com", user.getEmail());

    }
}

@Before 에서 UserService  를 생성해주고 Users 객체도 만들어 줬다. 그리고  UserRepository 는 Mock 으로 정의해줬다. 

실제 테스트케이스에는 when() 을 이용해서 UserRepository 가 실행됐을 때 미리 정의해둔 user1 객체를 리턴하게 만들었다. 그리고 verify 를 이용해서 실제 실행 여부를 확인했다. 

UserRepository를 Mock 으로 정의해서 테스트 케이스를 만들었다. 이유는 이미 repository 에 관련된 테스트는 repository test 에서 수행했다고 가정을 했기 때문에 굳이 repository를 실제 bean 으로 주입하고 DB 를 연결할 필요가 없다고 생각을 했다. Service 테스트케이스에서 중점적으로 체크해야 할 내용들은 조건문 처리, Exception  처리 등이 있을것 같다. 아래 코드는 Exception 에 대한 테스트 코드이다.

@Test(expected = RuntimeException.class)
public void findUserByIdException(){
  when(userRepository.findById("test011@test.com")).thenThrow(new RuntimeException("User not found"));
  userService.findUserById("test011@test.com");
}

파라메터의 null 체크 같은 경우는 좀 생각을 해봐야 할것 같다. 전에는 null 체크는 무조건 메소드 내에서 한다라고 생각을 했었는데 그렇게 코드를 짜다보니 Controller 에서 이미 null 체크를 한 파라메터를 메소드 내부에서 또 체크하는 경우가 생겼다. 지금 생각하기에는 파라메터를 넘겨주기 전에 null 체크를 해야 할것 같다는 생각이 든다. 

주의사항) 제 생각을 기준으로 작성하고 만든 소스코드이고 의견이기 때문에 틀린 부분이 있을수 있습니다.

 

728x90
반응형