SlideShare une entreprise Scribd logo
1  sur  13
Test doubles  Dummies, stubbar, mockar, spies & fakes Niklas Lindholm Agila Sverige 2010
Vad är en test double? ,[object Object]
Gör det möjligt att testa en bit kod i isolation genom att byta ut dess beroenden mot test doubles som kan kontrolleras i testet.
Mock-verktyg ,[object Object]
EasyMock (Java)
JMock (Java)
Rhino.Mocks (.NET)
Moq (.NET)
Nmock (.NET) ,[object Object]
Ibland är det lättare att själv implementera en test double än att använda ett verktyg.
Ibland är det lättare att inte använda test doubles alls utan använda de riktiga beroendena.
Stub ,[object Object]
Man verifierar inte att stuben verkligen blev anropad. Det man verifierar är att klassen man testar gör rätt saker med den data den får från stuben. (S.k. ”state based testing”)

Contenu connexe

Plus de Agila Sverige

Kasta ut experterna och fokusera på helheten
Kasta ut experterna och fokusera på helhetenKasta ut experterna och fokusera på helheten
Kasta ut experterna och fokusera på helhetenAgila Sverige
 
Vart tog tekniken vägen?
Vart tog tekniken vägen?Vart tog tekniken vägen?
Vart tog tekniken vägen?Agila Sverige
 
Visst kan vi självorganisera... vi ska bara fråga chefen först.
Visst kan vi självorganisera... vi ska bara fråga chefen först.Visst kan vi självorganisera... vi ska bara fråga chefen först.
Visst kan vi självorganisera... vi ska bara fråga chefen först.Agila Sverige
 
Hantera felhantering
Hantera felhanteringHantera felhantering
Hantera felhanteringAgila Sverige
 
Är det Agilt som gäller, eller?
Är det Agilt som gäller, eller?Är det Agilt som gäller, eller?
Är det Agilt som gäller, eller?Agila Sverige
 
Vad kan vi arkitekter lära oss av Agile?
Vad kan vi arkitekter lära oss av Agile?Vad kan vi arkitekter lära oss av Agile?
Vad kan vi arkitekter lära oss av Agile?Agila Sverige
 
When Worlds Collide II – Den kubistiska organisationens intåg?
When Worlds Collide II – Den kubistiska organisationens intåg?When Worlds Collide II – Den kubistiska organisationens intåg?
When Worlds Collide II – Den kubistiska organisationens intåg?Agila Sverige
 
Empiri på riktigt - en tilluxad agil utvecklingsmodell
Empiri på riktigt - en tilluxad agil utvecklingsmodellEmpiri på riktigt - en tilluxad agil utvecklingsmodell
Empiri på riktigt - en tilluxad agil utvecklingsmodellAgila Sverige
 
Praktiskt ledarskap i tavelmötet
Praktiskt ledarskap i tavelmötetPraktiskt ledarskap i tavelmötet
Praktiskt ledarskap i tavelmötetAgila Sverige
 
Konsten att skriva dåliga lappar
Konsten att skriva dåliga lapparKonsten att skriva dåliga lappar
Konsten att skriva dåliga lapparAgila Sverige
 
Det STORA missförståndet
Det STORA missförståndetDet STORA missförståndet
Det STORA missförståndetAgila Sverige
 
En agilare Säljgrupp
En agilare SäljgruppEn agilare Säljgrupp
En agilare SäljgruppAgila Sverige
 
Agil utan förändringar
Agil utan förändringarAgil utan förändringar
Agil utan förändringarAgila Sverige
 
Testdrivning med automatiska acceptanstester – praktiska erfarenheter
Testdrivning med automatiska acceptanstester – praktiska erfarenheterTestdrivning med automatiska acceptanstester – praktiska erfarenheter
Testdrivning med automatiska acceptanstester – praktiska erfarenheterAgila Sverige
 

Plus de Agila Sverige (20)

Kasta ut experterna och fokusera på helheten
Kasta ut experterna och fokusera på helhetenKasta ut experterna och fokusera på helheten
Kasta ut experterna och fokusera på helheten
 
Vart tog tekniken vägen?
Vart tog tekniken vägen?Vart tog tekniken vägen?
Vart tog tekniken vägen?
 
Visst kan vi självorganisera... vi ska bara fråga chefen först.
Visst kan vi självorganisera... vi ska bara fråga chefen först.Visst kan vi självorganisera... vi ska bara fråga chefen först.
Visst kan vi självorganisera... vi ska bara fråga chefen först.
 
Hantera felhantering
Hantera felhanteringHantera felhantering
Hantera felhantering
 
Är det Agilt som gäller, eller?
Är det Agilt som gäller, eller?Är det Agilt som gäller, eller?
Är det Agilt som gäller, eller?
 
Vad kan vi arkitekter lära oss av Agile?
Vad kan vi arkitekter lära oss av Agile?Vad kan vi arkitekter lära oss av Agile?
Vad kan vi arkitekter lära oss av Agile?
 
When Worlds Collide II – Den kubistiska organisationens intåg?
When Worlds Collide II – Den kubistiska organisationens intåg?When Worlds Collide II – Den kubistiska organisationens intåg?
When Worlds Collide II – Den kubistiska organisationens intåg?
 
Empiri på riktigt - en tilluxad agil utvecklingsmodell
Empiri på riktigt - en tilluxad agil utvecklingsmodellEmpiri på riktigt - en tilluxad agil utvecklingsmodell
Empiri på riktigt - en tilluxad agil utvecklingsmodell
 
Praktiskt ledarskap i tavelmötet
Praktiskt ledarskap i tavelmötetPraktiskt ledarskap i tavelmötet
Praktiskt ledarskap i tavelmötet
 
Konsten att skriva dåliga lappar
Konsten att skriva dåliga lapparKonsten att skriva dåliga lappar
Konsten att skriva dåliga lappar
 
Code Reviews
Code ReviewsCode Reviews
Code Reviews
 
Tajmboxat tänkande
Tajmboxat tänkandeTajmboxat tänkande
Tajmboxat tänkande
 
Agile Manager
Agile ManagerAgile Manager
Agile Manager
 
Det STORA missförståndet
Det STORA missförståndetDet STORA missförståndet
Det STORA missförståndet
 
En agilare Säljgrupp
En agilare SäljgruppEn agilare Säljgrupp
En agilare Säljgrupp
 
Budgeten är död
Budgeten är dödBudgeten är död
Budgeten är död
 
Agil utan förändringar
Agil utan förändringarAgil utan förändringar
Agil utan förändringar
 
Älska det du gör
Älska det du görÄlska det du gör
Älska det du gör
 
Testdrivning med automatiska acceptanstester – praktiska erfarenheter
Testdrivning med automatiska acceptanstester – praktiska erfarenheterTestdrivning med automatiska acceptanstester – praktiska erfarenheter
Testdrivning med automatiska acceptanstester – praktiska erfarenheter
 
Management by Scrum
Management by ScrumManagement by Scrum
Management by Scrum
 

Olika typer av test doubles (mock/stub-objekt) och hur de kan implementeras

  • 1. Test doubles Dummies, stubbar, mockar, spies & fakes Niklas Lindholm Agila Sverige 2010
  • 2.
  • 3. Gör det möjligt att testa en bit kod i isolation genom att byta ut dess beroenden mot test doubles som kan kontrolleras i testet.
  • 4.
  • 9.
  • 10. Ibland är det lättare att själv implementera en test double än att använda ett verktyg.
  • 11. Ibland är det lättare att inte använda test doubles alls utan använda de riktiga beroendena.
  • 12.
  • 13. Man verifierar inte att stuben verkligen blev anropad. Det man verifierar är att klassen man testar gör rätt saker med den data den får från stuben. (S.k. ”state based testing”)
  • 14. Egen stub-implementation @Test public void getMailAdressesForGroup_groupWithUsers_returnsList() throws Exception { UserNotifier userNotifier = new UserNotifier( new UserDbStub(), null ); List<String> adresses = userNotifier.getMailAdressesForGroup( &quot;agroup&quot; ); assertEquals ( &quot;Wrong addresses&quot; , Arrays. asList ( &quot;joe@foo.com&quot; , &quot;bob@bar.org&quot; ), adresses); } private static class UserDbStub implements UserDb { public List<User> getUsersInGroup(String groupName) { return &quot;agroup&quot; .equals(groupName) ? Arrays. asList ( new User( &quot;joe&quot; , &quot;joe@foo.com&quot; ), new User( &quot;bob&quot; , &quot;bob@bar.org&quot; )) : Collections.<User> emptyList (); } }
  • 15. Stub med Mockito @RunWith (MockitoJUnitRunner. class ) public class UserNotifierMockitoTests { @Mock private UserDb userDbStub ; @Test public void getMailAdressesForGroup_groupWithUsers_returnsList() throws Exception { when ( userDbStub .getUsersInGroup( &quot;agroup&quot; )).thenReturn(Arrays. asList ( new User( &quot;joe&quot; , &quot;joe@foo.com&quot; ), new User( &quot;bob&quot; , &quot;bob@bar.org&quot; ))); UserNotifier userNotifier = new UserNotifier( userDbStub , null ); List<String> adresses = userNotifier.getMailAdressesForGroup( &quot;agroup&quot; ); assertEquals ( &quot;Wrong addresses&quot; , Arrays. asList ( &quot;joe@foo.com&quot; , &quot;bob@bar.org&quot; ), adresses); }
  • 16.
  • 17.
  • 18. En mock vet i förväg hur den ska bli anropad så att den kan generera ett fel direkt när det inte stämmer. Enligt xunitpatterns.com:
  • 19. Egen spy-implementation @Test public void greetUser_validUserName_sendsEmail() { MailSenderSpy mailSenderSpy = new MailSenderSpy(); UserNotifier userNotifier = new UserNotifier( new UserDbStub(), mailSenderSpy); userNotifier.greetUser( &quot;joe&quot; ); assertEquals ( &quot;Wrong email address&quot; , &quot; [email_address] &quot; , mailSenderSpy.getEmailAdress()); } private static class MailSenderSpy implements MailSender { private String emailAdress ; public void sendEmail(String emailAdress) { this . emailAdress = emailAdress; } public String getEmailAdress() { return emailAdress ; } }
  • 20. Mock med Mockito @RunWith (MockitoJUnitRunner. class ) public class UserNotifierMockitoTests { @Mock private UserDb userDbStub ; @Mock private MailSender mailSenderMock ; @Test public void greetUser_validUserName_sendsEmail() throws Exception { when ( userDbStub .getUser( &quot;joe&quot; )).thenReturn( new User( &quot;joe&quot; , &quot;joe@foo.com&quot; )); UserNotifier userNotifier = new UserNotifier( userDbStub , mailSenderMock ); userNotifier.greetUser( &quot;joe&quot; ); verify ( mailSenderMock ).sendEmail( &quot;joe@foo.com&quot; ); } }
  • 21.
  • 22. Då man inte verifierar interaktionen med en fake kan man se den som en smartare stub.
  • 23. Fake public class MailSenderFake implements MailSender { public void sendEmail(String emailAdress) throws MailSenderException { if (!emailAdress.matches( &quot;[^@]+@[^@]+&quot; )) { throw new InvalidAddressException( &quot;Bad email address: &quot; + emailAdress); } if (emailAdress.endsWith( &quot;.error&quot; )) { throw new CanNotSendMailException( &quot;Failed sending mail to address: &quot; + emailAdress); } } }
  • 24.
  • 25. Den används bara tex som inparameter eller för att verifiera att samma objekt skickas vidare till ett annat beroende.
  • 26. En dummy behöver bara vara av rätt typ.