Scala for Backend Engineering & Functional Programming · Lezione

Mock e fixture

Configurazione dei test

Lezione 4 di 413 passaggi

Mock e fixture è una lezione Scala for Backend Engineering & Functional Programming gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Scala for Backend Engineering & Functional Programming, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Scala for Backend Engineering & Functional Programming include 4 lezioni in totale.

Configurazione e pulizia dei test

Molti test richiedono fixture condivise: dati o risorse preparati prima di un test e ripuliti dopo. ScalaTest offre diversi modi per gestirle senza duplicare il codice di configurazione.

Fixture semplice: solo un metodo

La fixture più semplice è un metodo di supporto che crea uno stato nuovo. Ogni test lo invoca, garantendo l'isolamento.

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

Integra BeforeAndAfter per eseguire codice prima e dopo ogni test usando i blocchi before { } e 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

Per risorse costose condivise da tutti i test di una suite, come una connessione al database o un server embedded, usa BeforeAndAfterAll con beforeAll e 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)
  }
}

Pattern della fixture in prestito

Il loan pattern passa una risorsa appena creata al corpo del test e garantisce la pulizia in un blocco finally, anche se il test fallisce.

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"
  }
}

Perché usare i mock?

Un mock è un sostituto di una dipendenza reale, come un database o un client HTTP, che mantiene uno unit test rapido e deterministico. Puoi controllare cosa restituisce il mock e verificare come viene invocato.

Aggiungere Mockito

ScalaTest si integra con Mockito tramite scalatestplus. Aggiungi la dipendenza e integra MockitoSugar.

libraryDependencies += "org.scalatestplus" %% "mockito-5-10" % "3.2.18.0" % Test

Stubbing di un metodo

Crea un mock e definiscine il comportamento con when(...).thenReturn(...). Il test esegue quindi il codice che dipende da esso.

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"
  }
}

Verificare le interazioni

Oltre ai valori restituiti, puoi verificare che un metodo sia stato chiamato il numero di volte previsto con 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")
  }
}

Mock, stub e fake

Terminologia:

  • Stub: restituisce risposte predefinite;
  • Mock: consente anche di verificare le interazioni;
  • Fake: un'implementazione funzionante e leggera, ad esempio un repository in memoria.

Quando è semplice, preferisci fake o oggetti reali; usa i mock solo per le vere dipendenze esterne.

Mantenere i test isolati

Fixture e mock hanno un unico obiettivo: ogni test deve essere eseguito in uno stato noto e indipendente. Reimposta lo stato mutabile condiviso prima di ogni test ed evita di condividere fixture mutabili tra i test, per prevenire fallimenti instabili e dipendenti dall'ordine di esecuzione.

Controllo rapido

Verifica la tua conoscenza di fixture e mocking.

Riepilogo

Hai imparato fixture e mocking:

  • fixture: metodi di supporto, BeforeAndAfter, BeforeAndAfterAll e loan pattern;
  • mock, tramite MockitoSugar: configura gli stub con when().thenReturn() e verifica le chiamate con verify;
  • preferisci i fake nei casi semplici; usa i mock per le dipendenze esterne;
  • mantieni ogni test isolato e indipendente dall'ordine.
Gratis per iniziare

Impara Scala con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
39
Lezioni
143

Domande Frequenti

La lezione «Mock e fixture» è gratuita?

Sì — il testo completo di «Mock e fixture» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Scala for Backend Engineering & Functional Programming, passa a CoddyKit PRO. Il corso Scala for Backend Engineering & Functional Programming include 4 lezioni in totale.

Cosa imparerò in «Mock e fixture»?

Configurazione dei test Eserciti Scala for Backend Engineering & Functional Programming con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Scala for Backend Engineering & Functional Programming?

Non è richiesta alcuna esperienza precedente. Scala for Backend Engineering & Functional Programming su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.

Quanto tempo richiede la lezione «Mock e fixture»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Scala for Backend Engineering & Functional Programming?

Sì. Ogni lezione Scala for Backend Engineering & Functional Programming include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Stili di ScalaTest
  2. Matcher
  3. Test basati sulle proprietà
  4. Mock e fixture
← Torna a Scala for Backend Engineering & Functional Programming