2013-12-10

Easymock tutorial

I skolan har vi använt oss en del av något som kallas Easymock och det tog mig ett tag att förstå mig på hur det fungerar. 
Easymock är ett sätt att testa en viss del av koden som har beroenden till andra delar. Easymockning fungerar som en bandspelare:  man spelar in något och man spelar upp något.


I vårt exempel så har vi endast en service som är beroende av ett repository. Vi struntar i databasen, men jag har ändå med den på bilden för att få lite mer förståelse.
Nu har vi metoder i våran service som vi vill testa att de fungerar, men servicen har ett beroende till vårat repository och vi vill enbart testa services. Detta löser vi genom att mocka bort vårt repository.

Först vill jag visa bara hur metoden ser ut som vi skall testa. 

@Service
public class PersonServiceImpl implements PersonService {

 @Autowired
 private PersonRepository personRepository;

 public Person createPerson(Person person) {
  
  long id = personRepository.createPerson(person); 
  return personRepository.getPerson(id);
 }

Som du ser har vi ett anrop till vårat repository där logiken ligger för att kunna skapa vår person. Detta beroendet måste vi mocka bort.

Vad man gör med Eaymock är att man först spelar in ett scenario med mockning och sedan spelar man upp det.

Låt oss titta på detta. 

public class PersonServiceTest {
 
 @Test
 public void testCreatePerson() {
  
  PersonRepository repo = EasyMock.createMock(PersonRepository.class);
  Person person = new Person("Arne", "Anka", "arne@anka.com", "07605050", "");
  EasyMock.expect(repo.createPerson(person)).andReturn(1l);
  EasyMock.expect(repo.getPerson(1l)).andReturn(person);
  EasyMock.replay(repo);
  
  PersonServiceImpl service = new PersonServiceImpl();
  service.setPersonRepository(repo);
  Person newPerson = service.createPerson(person);
  
  assertEquals("Created Person", person, newPerson);
    
 }
Det första som sker är att vi skapar själva mocken som vi vill göra oss oberoende av. Detta görs genom följande kod : EasyMock.createMock(PersonRepository.class);
Efter vi har gjort det så spelar vi in vårt scenario vi fejkar alltså vårt repo.
Eftersom vi skall skapa en Person så börjar vi med att skapa en person och skickar in värden.
När vi skapat en person vill vi använda vår createPerson metod i repot som vi mockar.
EasyMock.expect(repo.createPerson(person)).andReturn(1l);

expect innebär att det är en metod med ett retur värde och vi skickar in vårt egna värde, kan vara precis vad som helst men det måste vara samma datatyp som finns i metoden. I detta fall är det värde 1 som vi väljer av typen long. .andReturn(1l) behövs eftersom metoden vi testar returnerar ett värde. Så vi returnerar samma värde som vi skickade in.
Om du inte har en retur metod behöver du inte skriva expect och inte andReturn efteråt utan du skriver bara repo.cretePerson();
Efter vi har fejkat alla anrop vi behöver så spelar vi in hela scenariot genom att skriva :  EasyMock.replay(repo).
Nu vill vi spela upp alltihopa och testa vår Service.

                PersonServiceImpl service = new PersonServiceImpl();
  service.setPersonRepository(repo);
  Person newPerson = service.createPerson(person);

Vi skapar en referens till vår service och sätter repot som vår service.
Efter det så skapar vi vår person som är det vi har velat testa hela tiden.
Slutligen kör vi själva testet

assertEquals("Created Person", person, newPerson);



1 kommentar: