-
Notifications
You must be signed in to change notification settings - Fork 0
Introduktion till testning i Java
Den här sidan innehåller en mycket kort introduktion till testning
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.
public class MyCalculatorTestSuite {
@Test
public void testAddition() {
Mycalculator calc = new MyCalculator();
Assert.assertEquals("Addition is borked :( ", 2, calc.add(1,1));
}
}
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 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).