실무 프로젝트로 배우는 Kotlin & Spring/자바 프로젝트(ToDo프로젝트) 코틀린으로 리팩토링 하기

테스트 코드 리펙토링

webmaster 2022. 11. 5. 19:59
728x90

 JavaCOde

@ExtendWith(SpringExtension.class)
public class TodoServiceTests {

    @MockBean
    private TodoRepository repository;

    private TodoService service;

    private Todo stub;

    @BeforeEach
    public void setUp() {
        service = new TodoService(repository);
        stub = todoStub();
    }

    @Test
    public void 한개의_TODO를_반환해야한다() {
        // Given
        given(repository.findById(1L)).willReturn(Optional.of(stub));

        // When
        Todo actual = service.findById(1L);

        // Then
        assertThat(actual).isNotNull();
        assertThat(actual).isEqualTo(stub);
    }


    public Todo todoStub() {
        return Todo.builder()
                .id(1L)
                .title("테스트")
                .description("테스트 상세")
                .done(false)
                .createdAt(LocalDateTime.now())
                .updatedAt(LocalDateTime.now()).build();
    }


}

KotlinCode

@ExtendWith(SpringExtension::class)
class TodoServiceTests {

    @MockkBean
    lateinit var repository: TodoRepository //프레임워크 자체에서 lateinit을 해준다

    lateinit var service: TodoService

    val stub: Todo by lazy {
        Todo(
            id = 1,
            title = "테스트",
            description = "테스트 상세",
            done = false,
            createdAt = LocalDateTime.now(),
            updatedAt = LocalDateTime.now(),
        )
    }

    @BeforeEach
    fun setUp() {
        service = TodoService(repository)
    }

    @Test
    fun `한개의 TODO를 반환해야한다`() {
        //Given
        every { repository.findByIdOrNull(1) } returns stub //중위표현식을 사용해 표기할 수 있다

        //When
        val actual = service.findById(1L)

        //Then
        assertThat(actual).isNotNull
        assertThat(actual).isEqualTo(stub)
    }
}

build.gradle.kts

//...
dependencies {
	//...
    testImplementation("com.ninja-squad:springmockk:3.1.1") //테스트 목키토 라이브러리
}
//..
  • Test를 조금 더 코틀린스럽게 작성할 수 있도록 지원하는 springmockk를 사용하자
  • class를 참조할 때 더 이상. class로 접근하는 것이 아닌 프로퍼티 레퍼런스로 접근하면 된다.
  • lateinit 키워드를 통해 프레임워크 자체에서 늦게 해당 빈을 주입해 줄 수 있다.
  • lazy 키워드를 사용해 stub같은 경우 호출 시점에 1번만 초기화를 진행시켜 줄 수 있다(지연 초기화)
  • every는 given과 같이 사용할 수 있으며, 중위 표기법을 사용해 returns 뒤에 중위 표기법으로 작성해 줄 수 있다.
728x90