주로 한개의 단위를 3가지로 나눠서 처리하는 given-when-then 패턴을 사용
@Test
public void testFindUserById() {
// Given
UserRepository userRepository = Mockito.mock(UserRepository.class);
UserService userService = new UserService(userRepository);
Long userId = 1L;
User user = new User();
user.setId(userId);
user.setName("하재훈");
user.setEmail("haman@example.com");
Mockito.when(userRepository.findById(userId)).thenReturn(Optional.of(user));
// When
User foundUser = userService.findUserById(userId);
// Then
Assertions.assertNotNull(foundUser);
Assertions.assertEquals(userId, foundUser.getId());
Assertions.assertEquals("하재훈", foundUser.getName());
Assertions.assertEquals("haman@example.com", foundUser.getEmail());
}s
Fast: 테스트는 빠르게 동작하여 자주 돌릴 수 있어야 한다.
Independent: 각각의 테스트는 독립적이며 서로 의존해서는 안된다.
Repeatable: 어느 환경에서도 반복 가능해야 한다.
Self-Validating: 테스트는 성공 또는 실패로 bool 값으로 결과를 내어 자체적으로 검증되어야 한다.
Timely: 테스트는 적시에 즉, 테스트하려는 실제 코드를 구현하기 직전에 구현해야 한다.
TDD(Test-Driven Development)란?
- 테스트 주도 개발로, 테스트 코드를 먼저 작성하는 개발 방법론
TDD 접근 방법
- 가짜로 구현하기: 최대한 빨리 테스트를 통과하기 위해 정답이 아닌 가짜 정답을 구현하는 방법
- 실패하는 테스트를 가장 빠르게 구현하는 방법: 아무 값이나 반환하도록 하는 것
- 테스트 통과 시, 단계적으로 상수->변수를 사용하도록 변형- 삼각측량법: 값이 다른 여러 테스트를 작성하고, 이를 일반화하여 정답을 구현하는 방법
- 테스트 주도로 추상화된 과정을 일반화하는 과정
- 삼각 측량 방법은 테스트 예시가 2개 이상일 때에만 추상화를 해야 한다.
- 명백하게 구현하기: 정답을 바로 구현하는 방법
하지만 이런 단점들에 불구하고,
TDD를 사용하면 품질 좋은 코드를 만들 수 있고, 개발과정에서 생길 수 있는 버그들을 사전에 발견할 수 있기 때문에 현업에서 많은 개발자들이 TDD를 사용하고 있다고 한다.
다음 주에는 Junit, Mockito에 대해 더 다뤄볼 예정..