모킹과 픽스처
테스트 설정을 다룹니다
모킹과 픽스처은(는) CoddyKit의 무료 Scala for Backend Engineering & Functional Programming 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Scala for Backend Engineering & Functional Programming 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Scala for Backend Engineering & Functional Programming 강의에는 총 4개의 강의가 포함되어 있습니다.
테스트 설정과 정리
많은 테스트에는 공유 픽스처가 필요합니다. 픽스처란 테스트 전에 준비하고 테스트 후에 정리하는 데이터나 리소스입니다. ScalaTest는 설정 코드를 중복하지 않고 이를 관리하는 여러 방법을 제공합니다.
간단한 픽스처: 메서드만 사용하기
가장 간단한 픽스처는 새로운 상태를 만드는 도우미 메서드입니다. 각 테스트가 이 메서드를 호출하므로 테스트가 서로 격리됩니다.
import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers
class StackSpec extends AnyFlatSpec with Matchers {
def emptyStack(): scala.collection.mutable.Stack[Int] =
scala.collection.mutable.Stack.empty[Int]
"a stack" should "start empty" in {
emptyStack().size shouldBe 0
}
}BeforeAndAfter
BeforeAndAfter를 혼합하면 before { }와 after { } 블록을 사용하여 각 테스트 전후에 코드를 실행할 수 있습니다.
import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers
import org.scalatest.BeforeAndAfter
class DbSpec extends AnyFlatSpec with Matchers with BeforeAndAfter {
var counter = 0
before { counter = 10 }
after { counter = 0 }
"counter" should "be initialized" in {
counter shouldBe 10
}
}BeforeAndAfterAll
데이터베이스 연결이나 임베디드 서버처럼 테스트 모음의 모든 테스트에서 공유하는 비용이 큰 리소스에는 beforeAll과 afterAll을 함께 사용하는 BeforeAndAfterAll을 사용합니다.
import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.BeforeAndAfterAll
class ServerSpec extends AnyFlatSpec with BeforeAndAfterAll {
override def beforeAll(): Unit = println("start server")
override def afterAll(): Unit = println("stop server")
"server" should "respond" in {
assert(true)
}
}대여 픽스처 패턴
대여 패턴은 새로 만든 리소스를 테스트 본문에 전달하고, 테스트가 실패하더라도 finally에서 정리가 보장되도록 합니다.
import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers
class FileSpec extends AnyFlatSpec with Matchers {
def withBuffer(test: StringBuilder => Any): Unit = {
val buf = new StringBuilder("init")
try test(buf)
finally buf.clear()
}
"a buffer" should "start with init" in withBuffer { buf =>
buf.toString shouldBe "init"
}
}모킹하는 이유
목은 실제 의존성(데이터베이스나 HTTP 클라이언트)을 대신하는 객체로, 단위 테스트를 빠르고 결정적으로 유지해 줍니다. 목이 반환할 값을 제어하고 어떻게 호출되었는지도 확인할 수 있습니다.
Mockito 추가하기
ScalaTest는 scalatestplus를 통해 Mockito와 통합됩니다. 의존성을 추가하고 MockitoSugar를 혼합하세요.
libraryDependencies += "org.scalatestplus" %% "mockito-5-10" % "3.2.18.0" % Test메서드 스텁 만들기
목을 만들고 when(...).thenReturn(...)으로 동작을 설정합니다. 그런 다음 테스트에서 해당 목에 의존하는 코드를 실행합니다.
import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers
import org.scalatestplus.mockito.MockitoSugar
import org.mockito.Mockito.when
trait Repo { def find(id: Int): String }
class RepoSpec extends AnyFlatSpec with Matchers with MockitoSugar {
"a repo" should "return stubbed value" in {
val repo = mock[Repo]
when(repo.find(1)).thenReturn("Alice")
repo.find(1) shouldBe "Alice"
}
}상호작용 확인하기
반환 값뿐 아니라 verify를 사용하여 메서드가 예상한 횟수만큼 호출되었는지도 확인할 수 있습니다.
import org.scalatest.flatspec.AnyFlatSpec
import org.scalatestplus.mockito.MockitoSugar
import org.mockito.Mockito.{verify, times}
trait Logger { def log(msg: String): Unit }
class LogSpec extends AnyFlatSpec with MockitoSugar {
"a service" should "log once" in {
val logger = mock[Logger]
logger.log("hi")
verify(logger, times(1)).log("hi")
}
}목, 스텁, 페이크 비교
용어는 다음과 같습니다.
- 스텁: 미리 정해 둔 응답을 반환합니다.
- 목: 상호작용도 확인할 수 있습니다.
- 페이크: 가볍게 동작하는 구현입니다(예: 메모리 내 저장소).
간단한 경우에는 페이크나 실제 객체를 우선 사용하고, 실제 외부 의존성에만 목을 사용하세요.
테스트 격리 유지하기
픽스처와 목의 목표는 하나입니다. 각 테스트가 알려진 독립 상태에서 실행되도록 하는 것입니다. 테스트마다 공유하는 변경 가능한 상태를 초기화하고, 불안정하거나 순서에 따라 결과가 달라지는 실패를 방지하기 위해 변경 가능한 픽스처를 테스트 간에 공유하지 마세요.
빠른 확인
픽스처와 모킹에 대한 지식을 확인해 보세요.
복습
픽스처와 모킹을 배웠습니다.
- 픽스처: 도우미 메서드,
BeforeAndAfter,BeforeAndAfterAll, 대여 패턴 - 목(MockitoSugar 사용):
when().thenReturn()으로 스텁을 만들고verify로 호출을 확인합니다. - 간단한 경우에는 페이크를 우선 사용하고, 외부 의존성에는 목을 사용합니다.
- 모든 테스트를 서로 격리하고 실행 순서와 무관하게 유지합니다.
자주 묻는 질문
“모킹과 픽스처” 강의는 무료인가요?
네 — “모킹과 픽스처” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Scala for Backend Engineering & Functional Programming 강의 전체를 잠금 해제할 수 있습니다. Scala for Backend Engineering & Functional Programming 강의에는 총 4개의 강의가 포함되어 있습니다.
“모킹과 픽스처”에서 뭘 배우나요?
테스트 설정을 다룹니다 브라우저에서 직접 실행하는 실습 코드로 Scala for Backend Engineering & Functional Programming을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Scala for Backend Engineering & Functional Programming을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Scala for Backend Engineering & Functional Programming은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“모킹과 픽스처” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Scala for Backend Engineering & Functional Programming 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Scala for Backend Engineering & Functional Programming 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- ScalaTest 스타일
- 매처
- 속성 기반 테스트
- 모킹과 픽스처