두 테스트 코드의 차이점을 설명하면서, 각 코드가 어떻게 작동하는지와 추가된 부분의 의미를 설명해드리겠습니다.
@Test
@DisplayName("Post 작성 성공")
void testCreatePostSuccess() {
String title = "Sample Title";
String body = "Sample body";
String userName = "sampleUserName";
// Mocking
when(userEntityRepository.findByUserName(userName)).thenReturn(Optional.of(mock(UserEntity.class)));
when(PostEntityRepository.save(any(PostEntity.class))).thenReturn(mock(PostEntity.class));
PostEntity mockPost = new PostEntity(title, body);
when(PostEntityRepository.save(any())).thenReturn(mockPost);
Assertions.assertDoesNotThrow(() -> postService.createPost(title, body, userName));
}
userEntityRepository Mocking: findByUserName(userName) 호출 시 모의 UserEntity 객체를 반환하도록 설정하여, 데이터베이스에 실제 사용자가 있는 것처럼 시뮬레이션합니다.PostEntityRepository Mocking:PostEntityRepository.save(any(PostEntity.class)) 호출 시 mock(PostEntity.class) 객체가 반환되도록 설정합니다.PostEntity mockPost를 생성하여, PostEntityRepository.save(any()) 호출 시 mockPost를 반환하도록 추가로 설정합니다.Assertions.assertDoesNotThrow(...): postService.createPost(...) 호출 시 예외가 발생하지 않는지 확인합니다. 여기서 예외가 발생하면 안 되는 이유는, 성공적인 Post 생성 로직이 실행되었음을 확인하는 테스트이기 때문입니다. 예외가 발생하면 Post 생성이 실패한 것으로 간주됩니다.PostEntity 인스턴스를 두 번 Mocking하는 불필요한 중복이 있을 수 있습니다. @Test
@DisplayName("Post 작성 성공")
void testCreatePostSuccess() {
TestInfoFixture.TestInfo fixture = TestInfoFixture.get();
when(userEntityRepository.findByUserName(fixture.getUserName()))
.thenReturn(Optional.of(UserEntityFixture.get(fixture.getUserName(), fixture.getPassword())));
when(postEntityRepository.save(any())).thenReturn(mock(PostEntity.class));
Assertions.assertDoesNotThrow(() ->
postService.createPost(fixture.getUserName(), fixture.getTitle(), fixture.getBody())
);
}
TestInfoFixture를 사용한 Mocking: TestInfoFixture.get() 메서드를 사용하여 fixture 객체를 받아옵니다. 이 객체는 테스트용 데이터를 포함한 객체로, userName, title, body 등의 속성을 가진 TestInfoFixture.TestInfo 인스턴스입니다.UserEntityFixture.get(...)을 통해 실제와 유사한 UserEntity 객체를 생성하고 반환합니다. 이는 데이터가 일관된 형태를 유지하도록 도와주어 테스트의 가독성을 높입니다.userEntityRepository.findByUserName(fixture.getUserName())이 호출되면 UserEntityFixture.get(...)을 통해 생성된 모의 UserEntity가 반환되도록 설정합니다.postEntityRepository.save(any()) Mocking: postEntityRepository.save(any())가 호출될 때 모의 PostEntity 객체를 반환하도록 설정합니다.| 특성 | 첫 번째 테스트 | 두 번째 테스트 |
|---|---|---|
| 데이터 설정 방식 | 하드코딩된 문자열 사용 | TestInfoFixture를 통한 테스트 데이터 설정 |
| Mocking 중복 여부 | PostEntityRepository.save 중복 Mocking | postEntityRepository.save 단일 Mocking |
| Fixture 사용 여부 | 사용하지 않음 | UserEntityFixture 및 TestInfoFixture 사용 |
| 테스트 가독성 | 하드코딩으로 코드가 길어질 수 있음 | Fixture로 더 읽기 쉽고 관리가 용이함 |
결론적으로, 두 번째 코드가 Fixture를 통해 데이터 일관성을 제공하고, 중복된 Mocking을 제거하여 가독성과 유지보수성을 높인 테스트 코드입니다. Fixture를 적극적으로 활용하면 코드의 구조가 더 명확해지고 테스트 유지 관리가 용이해집니다.