Skip to content

Coroutine ‐ Coroutine Testing

woojin.jang edited this page May 24, 2026 · 3 revisions

코틀린 단위 테스트 기초 - 테스트 더블

  • 테스트 더블은 객체에 대한 대체물로 객체의 행동을 모방하는 객체이다.
  • 다른 객체와 의존성을 가진 객체를 테스트하기 위해 테스트 더블이 필요하다.
  • 테스트 더블의 종류로는 대표적으로 스텁(Stub), 페이크(Fake), 목(Mock) 이 3가지가 있다.
  • Stub
    • 스텁이란, 미리 정의된 데이터를 반환하는 모방 객체이다. 반환 값이 없는 함수는 구현하지 않고 반환 값이 있는 동작만 미리 정의된 데이터를 반환하도록 구현한다.
    • 이 때, 스텁을 만들 때 미리 정의된 데이터를 내부 프로퍼티로 고정하면 유연하지 못해진다.
    • 유연하게 만들기 위해서는 미리 정의된 데이터를 주입 받는 형태로 만들어야 한다.
  • Fake
    • 페이크란, 실제 객체와 비슷하게 동작하도록 구현된 모방 객체이다.

코루틴 단위 테스트

  • 간단한 일시 중단 함수를 테스트 할 때는 runBlocking() 함수를 사용해 코루틴을 만들면 된다.
  • runBlocking() 함수를 사용해 실행에 오랜 시간이 걸리는 일시 중단 함수를 테스트하면 문제가 생긴다.
class RepeatAddUseCaseTest {
    @Test
    fun `100번 더하면 100이 반환된다`(): Unit = runBlocking {
        // Given
        val repeatAddUseCase = RepeatAddUseCase()

        // When
        val result: Int = repeatAddUseCase.add(100)

        // Then
        assertEquals(100, result)
    }
}

코루틴 테스트 라이브러리

  • 코루틴 테스트 라이브러리는 TestCoroutineScheduler 객체를 통해 가상 시간에서 테스트를 진행할 수 있도록 하는 기능을 제공한다.
  • TestCoroutineScheduler 객체를 사용하면 시간을 자유자재로 다룰 수 있다.
  • TestCoroutineScheduler.advanceTimeBy() : 가상 시간을 흐르게 만들 수 있다.
  • TestCoroutineScheduler.currentTime : 현재 시간(가상 시간)을 알 수 있다.
class CoroutineTimerTest {

    @OptIn(ExperimentalCoroutinesApi::class)
    @Test
    fun `가상 시간 조절 테스트`() {
        val testCoroutineScheduler = TestCoroutineScheduler()

        testCoroutineScheduler.advanceTimeBy(5000L) // 5초를 흐르게 만듦
        assertEquals(5000L, testCoroutineScheduler.currentTime) // 현재 시간이 5초임을 단언

        testCoroutineScheduler.advanceTimeBy(6000L) // 6초를 흐르게 만듦
        assertEquals(11000L, testCoroutineScheduler.currentTime) // 현재 시간이 11초임을 단언

        testCoroutineScheduler.advanceTimeBy(10000L) // 10초를 흐르게 만듦
        assertEquals(21000L, testCoroutineScheduler.currentTime) // 현재 시간이 21초임을 단언
    }
}

📖 Java

📖 Kotlin

📖 Coroutine

📖 Spring

📖 Spring Security

📖 Spring Batch

📖 Reactive Programming

📖 Database

📖 MySQL

📖 Redis

📖 JPA

📖 QueryDsl

📖 MSA

📖 Kafka

📖 Apache Flink

  • [Apache Flink - Apache Flink Architecture]
  • [Apache Flink - Stream Processing]
  • [Apache Flink - Data Stream API & Window]
  • [Apache Flink - State Management]

📖 HTTP

📖 AWS

📖 Docker

📖 Kubernetes

📖 CI/CD

📖 Nginx

📖 Monitoring🥈

  • [Monitoring - Log Concept]
  • [Monitoring - Log Level & Filter]
  • [Monitoring - Logback]
  • [Monitoring - Log Collection with ELK Stack]
  • [Monitoring - Log Monitoring with Kibana]
  • [Monitoring - Building a Monitoring System with Spring Boot Actuator]
  • [Monitoring - Server Monitoring with Prometheus and Grafana with Discord Alerts]

📖 Test

📖 Effective Java 3/E

📖 Kotlin Academy - Effective Kotlin

📖 Kotlin Academy - 핵심편

📖 스프링으로 시작하는 리액티브 프로그래밍

📖 가상 면접 사례로 배우는 대규모 시스템 설계 기초 1

📖 가상 면접 사례로 배우는 대규모 시스템 설계 기초 2

📖 Clean Code

📖 리팩토링 2판

📖 주니어 백엔드 개발자가 반드시 알아야 할 실무 지식

📖 GraphQL

Clone this wiki locally