Skip to content

Introduktion till testning i Java

chilmers edited this page Jun 6, 2012 · 1 revision

Den här sidan innehåller en mycket kort introduktion till testning

Enhetstest

Ett enhetstest görs ofta på en liten enhet i isolation från omvärlden, se exemplet på JUnit-test nedan. Man testar alltså en liten och avgränsad del av koden. Om den enhet med kod som man vill testa är beroende av någon annan kod, t.ex. ett metod-anrop till en annan del av din kod så kan man använda sig av något som kallas för mockning.

Exempel på enhetstest med JUnit

public class MyCalculatorTestSuite {
    @Test
    public void testAddition() {
        Mycalculator calc = new MyCalculator();
        Assert.assertEquals("Addition is borked :( ", 2, calc.add(1,1));
    }
}

Mock-objekt

Man säger att man mockar ett objekt av en klass och det betyder att man skapar ett objekt med förutsägbart beteende som man byter ut mot det objekt som normalt finns som beroende i den kod man vill testa. Detta kan man göra med en del olika ramverk som Mockito (http://code.google.com/p/mockito/), EasyMock, PowerMock med flera.

Här är ett exempel med Mockito (som är ganska rättframt jämfört med övriga enligt mig): Obs, importerna är borta för jag kommer inte ihåg dem utantill jag har därför inte heller testat om det kompilerar ;-)

Nedan är tjänst som skall testas, detta är en implementation av EmployeeService-interfacet som använder sig av funktionaliteten som specificeras av SalaryService-interfacet.

public class EmployeeServiceImpl implements EmployeeService {
    private SalaryService salaryService;  // NB! SalaryService är ett interface, inte en klass
    private double tax = 0.32;
    public double getNetSalaryForEmployee(long employeeId) {
        double salary = salaryService.getSalary(employeeId);
        return salary * (1-tax);
    }
    public void setSalaryService(SalaryService salaryService) {
        this.salaryService = salaryService;
    }
}

Nedan är ett JUnit-test som utnyttjar Mockito för mockning av SalaryService för att kunna testa EmployeeService i isolation.

public class EmployeeServiceTest {
    
    @Test
    public void testGetNetSalaryForEmployee() {
        EmployeeService empSvc = new EmployeeService();

        // Skapa ett mock-objekt
        SalaryService mockedSalaryService = Mockito.mock(SalaryService.class);
        // Skapa ett beteende för mock-objektet
        Mockito.when(mockedSalaryService.getSalary(1)).thenReturn(100);
        // Injicera mock-objektet i klassen som skall testas
        empSvc.setSalaryService(mockedSalaryService);

        Assert.assertEquals(68.00, empSvc.getNetSalaryForEmployee(1));
    }
}

Integrationstest

Integrationstest kan man säga är motsatsen till enhetstest. Ett integrationstest görs inte i isolation utan i en så fulltständig kontext som möjligt för att se hur systemet integrerar med andra delar till exempel databaser, web-services eller andra integrationspunkter. Kan också skrivas i JUnit men ofta använder man inte mockning vi integrationstester (förutom i vissa speciella fall där testet är svårt att åstadkomma på annat sätt).

Clone this wiki locally