Testning på avancerad nivå: JUnit, Mockito och integrationstester · Lektion

Refaktorering för testbarhet

Lär dig hur TDD naturligt leder till bättre koddesign och hur ni kan refaktorera säkert med tillit till era tester.

Lektion 3 av 411 steg

Refaktorering för testbarhet är en gratis lektion i Testning på avancerad nivå: JUnit, Mockito och integrationstester på CoddyKit. Detta är lektion 3 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Testning på avancerad nivå: JUnit, Mockito och integrationstester, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Testning på avancerad nivå: JUnit, Mockito och integrationstester innehåller totalt 4 lektioner.

Refaktorering i TDD: En introduktion

I testdriven utveckling (TDD) är steget ”Refactor” avgörande. När vi har skrivit ett test som misslyckas (Red) och fått det att lyckas (Green) går vi in i fasen Refactor.

Refaktorering innebär att förbättra kodens interna struktur utan att ändra dess externa beteende. Det handlar om att göra koden renare, mer lättläst och enklare att underhålla.

Testernas skyddsnät

Varför är refaktorering säkert i TDD? Därför att Ni har en omfattande svit med tester som lyckas!

  • Trygghet: Era tester fungerar som ett skyddsnät och säkerställer att strukturella ändringar inte introducerar nya buggar.
  • Återkoppling: Om ett test misslyckas efter refaktoreringen vet Ni omedelbart att något har gått sönder, så att Ni kan återställa eller rätta till det.

Den här tryggheten gör det möjligt för utvecklare att kontinuerligt förbättra kodkvaliteten.

Vad är testbar kod?

Refaktorering leder naturligt till mer testbar kod. Men vad gör kod testbar?

  • Liten och fokuserad: Kodenheter (metoder, klasser) gör en sak på ett bra sätt.
  • Lös koppling: Komponenterna har minimala beroenden av varandra.
  • Tydligt ansvar: Varje klass eller metod har ett enda, väldefinierat syfte.

Dessa principer gör det enklare att isolera och testa enskilda delar.

Kodlukt: Dolda beroenden

Tänk på en klass som bearbetar data och dessutom loggar meddelanden direkt till konsolen. Det skapar ett ”dolt beroende” av System.out, vilket gör det svårare att testa bearbetningslogiken isolerat.

Vi vill testa om processData fungerar, inte om System.out.println fungerar!

Exempel: Svårtestad kod

Här är en enkel ReportGenerator. Observera hur den använder System.out.println direkt. Det gör det svårt att testa logiken för rapportgenereringen utan att se konsolutdata.

public class ReportGenerator {
  public String generateReport(String data) {
    // Simulate some complex processing
    String processedData = "Processed: " + data.toUpperCase();
    System.out.println("Log: Report generated for " + data);
    return processedData;
  }

  public static void main(String[] args) {
    ReportGenerator generator = new ReportGenerator();
    System.out.println(generator.generateReport("sales"));
  }
}

Refaktorering: Extrahera ett gränssnitt

För att förbättra testbarheten kan vi introducera ett gränssnitt för vår loggningsmekanism. Det frikopplar ReportGenerator från en specifik loggningsimplementation.

Ett gränssnitt definierar ett kontrakt: vilka metoder en klass måste implementera.

public interface Logger {
  void log(String message);
}

public class ConsoleLogger implements Logger {
  @Override
  public void log(String message) {
    System.out.println("Console: " + message);
  }
}

Refaktorering: Beroendeinjektion

Nu kan vi injicera beroendet Logger i konstruktorn för ReportGenerator. Detta kallas beroendeinjektion.

ReportGenerator skapar inte längre sin logger, utan tar emot den. Det gör det mycket enklare att tillhandahålla en ”mock”-logger vid testning.

public interface Logger {
  void log(String message);
}

public class ConsoleLogger implements Logger {
  @Override
  public void log(String message) {
    System.out.println("Console: " + message);
  }
}

public class ReportGenerator {
  private final Logger logger;

  public ReportGenerator(Logger logger) {
    this.logger = logger;
  }

  public String generateReport(String data) {
    String processedData = "Processed: " + data.toUpperCase();
    logger.log("Report generated for " + data);
    return processedData;
  }

  public static void main(String[] args) {
    Logger consoleLogger = new ConsoleLogger();
    ReportGenerator generator = new ReportGenerator(consoleLogger);
    System.out.println(generator.generateReport("sales"));
  }
}

Fördelen med testbarhet

Med beroendeinjektion blir testning mycket enklare:

  • Ni kan skicka in en riktig ConsoleLogger i produktion.
  • I enhetstester kan Ni skicka in ett testdubbleringsobjekt (till exempel en mock) som registrerar anrop utan faktisk konsolutdata. Då kan Ni kontrollera att logger.log() anropades som förväntat utan att påverka testutdata.

Det gör logiken i ReportGenerator verkligt isolerad och testbar.

Kontinuerlig förbättring

Refaktorering är inte en engångshändelse, utan en kontinuerlig vana inom TDD-cykeln. Efter varje test som lyckas bör Ni ta en stund och leta efter sätt att förbättra koden.

  • Scouternas regel: Lämna alltid lägerplatsen renare än Ni fann den. Tillämpa detta på kod: lämna alltid modulen renare än när Ni började arbeta med den.

Det leder till en kodbas som naturligt utvecklas mot bättre design och högre kvalitet.

Kontroll av refaktoreringens fördelar

Fundera över fördelarna med refaktorering för testbarheten.

Sammanfattning: Refaktorering för TDD

I den här lektionen utforskade vi det viktiga steget ”Refactor” i TDD. Vi lärde oss att refaktorering, med stöd av tester som lyckas, gör det möjligt att tryggt förbättra kodens design utan att ändra beteendet.

  • Vi såg hur refaktorering leder till mer testbar kod genom att främja lös koppling och beroendeinjektion.
  • Det gör det enklare att isolera enheter för testning och att använda testdubbleringsobjekt.
  • Refaktorering är en kontinuerlig process som förbättrar kodkvalitet och underhållbarhet över tid.

Fortsätt refaktorera för att bygga robust och ren programvara!

Gratis att börja

Lär dig Testning på avancerad nivå: JUnit, Mockito och integrationstester med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
12
Lektioner
48

Vanliga frågor

Är lektionen ”Refaktorering för testbarhet” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Testning på avancerad nivå: JUnit, Mockito och integrationstester, inklusive ”Refaktorering för testbarhet”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Testning på avancerad nivå: JUnit, Mockito och integrationstester innehåller totalt 4 lektioner.

Vad lär jag mig i ”Refaktorering för testbarhet”?

Lär dig hur TDD naturligt leder till bättre koddesign och hur ni kan refaktorera säkert med tillit till era tester. Ni övar på Testning på avancerad nivå: JUnit, Mockito och integrationstester med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Testning på avancerad nivå: JUnit, Mockito och integrationstester?

Du behöver inga förkunskaper. Utbildningen i Testning på avancerad nivå: JUnit, Mockito och integrationstester på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 4.

Hur lång tid tar lektionen ”Refaktorering för testbarhet”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Testning på avancerad nivå: JUnit, Mockito och integrationstester-lektionen?

Ja. Varje Testning på avancerad nivå: JUnit, Mockito och integrationstester-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Introduktion till TDD-cykeln
  2. Skriva tester först
  3. Refaktorering för testbarhet
  4. TDD:s tre lagar
← Tillbaka till Testning på avancerad nivå: JUnit, Mockito och integrationstester