Mockowanie i fixture’y
Konfiguracja testów
Mockowanie i fixture’y to bezpłatna lekcja Scala for Backend Engineering & Functional Programming na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Scala for Backend Engineering & Functional Programming, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Scala for Backend Engineering & Functional Programming zawiera 4 lekcji w sumie.
Konfiguracja i sprzątanie po testach
Wiele testów wymaga współdzielonych fixture'ów: danych lub zasobów przygotowanych przed testem i posprzątanych po nim. ScalaTest oferuje kilka sposobów zarządzania nimi bez powielania kodu konfiguracji.
Prosty fixture: tylko metoda
Najprostszy fixture to metoda pomocnicza, która tworzy świeży stan. Każdy test ją wywołuje, co gwarantuje izolację.
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
Dodaj BeforeAndAfter, aby uruchamiać kod przed i po każdym teście za pomocą bloków before { } i 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
W przypadku kosztownych zasobów współdzielonych przez wszystkie testy w zestawie (na przykład połączenia z bazą danych lub osadzonego serwera) użyj BeforeAndAfterAll razem z beforeAll i afterAll.
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)
}
}Wzorzec loan-fixture
Wzorzec loan przekazuje świeżo utworzony zasób do ciała testu i gwarantuje jego posprzątanie w bloku finally, nawet jeśli test zakończy się niepowodzeniem.
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"
}
}Dlaczego mockowanie?
Mock jest zastępstwem rzeczywistej zależności (np. bazy danych lub klienta HTTP), dzięki czemu test jednostkowy pozostaje szybki i deterministyczny. Kontrolujesz wartości zwracane przez mock i weryfikujesz sposób jego wywołania.
Dodawanie Mockito
ScalaTest integruje się z Mockito za pośrednictwem scalatestplus. Dodaj zależność i domieszaj MockitoSugar.
libraryDependencies += "org.scalatestplus" %% "mockito-5-10" % "3.2.18.0" % TestStubowanie metody
Utwórz mock i zaprogramuj jego zachowanie za pomocą when(...).thenReturn(...). Test wykonuje następnie kod, który od niego zależy.
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"
}
}Weryfikowanie interakcji
Oprócz wartości zwracanych możesz sprawdzić, czy metoda została wywołana oczekiwaną liczbę razy, używając 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")
}
}Mocki a stuby i fake'i
Terminologia:
- Stub: zwraca z góry przygotowane odpowiedzi.
- Mock: dodatkowo umożliwia weryfikowanie interakcji.
- Fake: lekka, działająca implementacja (np. repozytorium w pamięci).
Gdy to proste, preferuj fake'i lub rzeczywiste obiekty; mockuj tylko prawdziwe zależności zewnętrzne.
Utrzymywanie izolacji testów
Fixture'y i mocki mają jeden cel: każdy test ma być uruchamiany w znanym, niezależnym stanie. Resetuj współdzielony zmienny stan przed każdym testem i unikaj współdzielenia zmiennych fixture'ów między testami, aby zapobiegać niestabilnym błędom zależnym od kolejności.
Szybki sprawdzian
Sprawdź swoją wiedzę o fixture'ach i mockowaniu.
Podsumowanie
Nauczyłeś się korzystać z fixture'ów i mockowania:
- Fixture'y: metody pomocnicze,
BeforeAndAfter,BeforeAndAfterAlli wzorzec loan. - Mocki (za pośrednictwem MockitoSugar): stubuj za pomocą
when().thenReturn(), a wywołania sprawdzaj przezverify. - W prostych przypadkach preferuj fake'i; mockuj zależności zewnętrzne.
- Zapewniaj izolację każdego testu i niezależność od kolejności.
Często zadawane pytania
Czy lekcja „Mockowanie i fixture’y” jest bezpłatna?
Tak — pełny tekst „Mockowanie i fixture’y” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Scala for Backend Engineering & Functional Programming, przejdź na CoddyKit PRO. Kurs Scala for Backend Engineering & Functional Programming zawiera 4 lekcji w sumie.
Co nauczysz się w „Mockowanie i fixture’y”?
Konfiguracja testów Ćwiczysz Scala for Backend Engineering & Functional Programming z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Scala for Backend Engineering & Functional Programming?
Nie wymagamy żadnego doświadczenia. Scala for Backend Engineering & Functional Programming w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.
Ile czasu zajmuje lekcja „Mockowanie i fixture’y”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Scala for Backend Engineering & Functional Programming?
Tak. Każda lekcja Scala for Backend Engineering & Functional Programming zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Style ScalaTest
- Matchery
- Testowanie oparte na właściwościach
- Mockowanie i fixture’y