커넥티 테스트코드(3) 다른 코드 비교

CosmoNumb·2024년 11월 5일

두 테스트 코드의 차이점을 설명하면서, 각 코드가 어떻게 작동하는지와 추가된 부분의 의미를 설명해드리겠습니다.


첫 번째 테스트 코드

@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)); 
}

설명

  1. userEntityRepository Mocking: findByUserName(userName) 호출 시 모의 UserEntity 객체를 반환하도록 설정하여, 데이터베이스에 실제 사용자가 있는 것처럼 시뮬레이션합니다.
  2. PostEntityRepository Mocking:
    • PostEntityRepository.save(any(PostEntity.class)) 호출 시 mock(PostEntity.class) 객체가 반환되도록 설정합니다.
    • 이후 PostEntity mockPost를 생성하여, PostEntityRepository.save(any()) 호출 시 mockPost를 반환하도록 추가로 설정합니다.
  3. Assertions.assertDoesNotThrow(...): postService.createPost(...) 호출 시 예외가 발생하지 않는지 확인합니다. 여기서 예외가 발생하면 안 되는 이유는, 성공적인 Post 생성 로직이 실행되었음을 확인하는 테스트이기 때문입니다. 예외가 발생하면 Post 생성이 실패한 것으로 간주됩니다.

특징

  • 이 테스트는 기본적인 Mocking만 수행하고 있습니다.
  • 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())
    );
}

설명

  1. TestInfoFixture를 사용한 Mocking: TestInfoFixture.get() 메서드를 사용하여 fixture 객체를 받아옵니다. 이 객체는 테스트용 데이터를 포함한 객체로, userName, title, body 등의 속성을 가진 TestInfoFixture.TestInfo 인스턴스입니다.
  2. Fixture를 사용한 데이터 설정:
    • UserEntityFixture.get(...)을 통해 실제와 유사한 UserEntity 객체를 생성하고 반환합니다. 이는 데이터가 일관된 형태를 유지하도록 도와주어 테스트의 가독성을 높입니다.
    • userEntityRepository.findByUserName(fixture.getUserName())이 호출되면 UserEntityFixture.get(...)을 통해 생성된 모의 UserEntity가 반환되도록 설정합니다.
  3. postEntityRepository.save(any()) Mocking: postEntityRepository.save(any())가 호출될 때 모의 PostEntity 객체를 반환하도록 설정합니다.

특징

  • Fixture를 통해 데이터의 일관성을 유지합니다. Fixture는 여러 테스트에서 동일한 데이터를 사용하여, 테스트 코드의 반복을 줄이고 코드 가독성을 높입니다.
  • 더 깔끔한 Mocking: PostEntity의 Mocking이 단일 호출로 이루어지며, 첫 번째 테스트에 비해 불필요한 Mocking이 줄어듭니다.

비교 및 차이점 요약

특성첫 번째 테스트두 번째 테스트
데이터 설정 방식하드코딩된 문자열 사용TestInfoFixture를 통한 테스트 데이터 설정
Mocking 중복 여부PostEntityRepository.save 중복 MockingpostEntityRepository.save 단일 Mocking
Fixture 사용 여부사용하지 않음UserEntityFixture 및 TestInfoFixture 사용
테스트 가독성하드코딩으로 코드가 길어질 수 있음Fixture로 더 읽기 쉽고 관리가 용이함

결론적으로, 두 번째 코드가 Fixture를 통해 데이터 일관성을 제공하고, 중복된 Mocking을 제거하여 가독성과 유지보수성을 높인 테스트 코드입니다. Fixture를 적극적으로 활용하면 코드의 구조가 더 명확해지고 테스트 유지 관리가 용이해집니다.

0개의 댓글