Your SlideShare is downloading. ×
0
Struggling to Create Maintainable Unit Tests?
Struggling to Create Maintainable Unit Tests?
Struggling to Create Maintainable Unit Tests?
Struggling to Create Maintainable Unit Tests?
Struggling to Create Maintainable Unit Tests?
Struggling to Create Maintainable Unit Tests?
Struggling to Create Maintainable Unit Tests?
Struggling to Create Maintainable Unit Tests?
Struggling to Create Maintainable Unit Tests?
Struggling to Create Maintainable Unit Tests?
Struggling to Create Maintainable Unit Tests?
Struggling to Create Maintainable Unit Tests?
Struggling to Create Maintainable Unit Tests?
Struggling to Create Maintainable Unit Tests?
Struggling to Create Maintainable Unit Tests?
Struggling to Create Maintainable Unit Tests?
Struggling to Create Maintainable Unit Tests?
Struggling to Create Maintainable Unit Tests?
Struggling to Create Maintainable Unit Tests?
Struggling to Create Maintainable Unit Tests?
Struggling to Create Maintainable Unit Tests?
Struggling to Create Maintainable Unit Tests?
Struggling to Create Maintainable Unit Tests?
Struggling to Create Maintainable Unit Tests?
Struggling to Create Maintainable Unit Tests?
Struggling to Create Maintainable Unit Tests?
Struggling to Create Maintainable Unit Tests?
Struggling to Create Maintainable Unit Tests?
Struggling to Create Maintainable Unit Tests?
Struggling to Create Maintainable Unit Tests?
Struggling to Create Maintainable Unit Tests?
Struggling to Create Maintainable Unit Tests?
Struggling to Create Maintainable Unit Tests?
Struggling to Create Maintainable Unit Tests?
Struggling to Create Maintainable Unit Tests?
Struggling to Create Maintainable Unit Tests?
Struggling to Create Maintainable Unit Tests?
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Struggling to Create Maintainable Unit Tests?

3,677

Published on

Learn how to create maintainable unit tests by using jMock with Test Data Builders.

Learn how to create maintainable unit tests by using jMock with Test Data Builders.

Published in: Technology, Business
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
3,677
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
40
Comments
0
Likes
1
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1.  
  • 2.  
  • 3. Protocol => Mocks Data => Builders
  • 4. Roadmap <ul><li>Define Maintainable Unit Test </li></ul><ul><li>Create a Shared Vocabulary </li></ul><ul><li>Examples </li></ul><ul><li>When to Use Mocks </li></ul>
  • 5. Define Maintainable Unit Test
  • 6. 10% of Unit Tests Break <ul><li>If you really have a lot of unit tests, the amount of investment you'll have to make in maintaining those unit tests, keeping them up-to-date and keeping them passing, starts to become disproportional to the amount of benefit that you get out of them. </li></ul><ul><li>— Joel Spolsky </li></ul>
  • 7. Maintainable Unit Tests <ul><li>The benefits of unit tests outweigh the costs as a codebase evolves. </li></ul>
  • 8. Shared Vocabulary
  • 9. Mocks Builders
  • 10.  
  • 11. xUnit Test Patterns
  • 12. Mocks Builders
  • 13. Mock Object <ul><li>A mock object is a simulated object that mimics the behaviour of a real object in controlled ways. </li></ul>
  • 14. Test Data Builder <ul><li>Builder Pattern </li></ul><ul><li>build() method </li></ul><ul><li>Default values </li></ul><ul><li>Chainable configuration methods </li></ul>
  • 15. Shared Vocabulary <ul><li>4–Phase Test </li></ul><ul><li>System Under Test </li></ul><ul><li>Depended–On Component </li></ul><ul><li>Mock Objects </li></ul><ul><li>Test Data Builders </li></ul>
  • 16. Examples
  • 17.  
  • 18. Domain Model
  • 19. public void should_recognize_pediatric_patient() { // setup Patient sut = aPatient ().age(17).build(); // exercise and verify assertTrue (sut.isPediatric()); assertTrue (!sut.isAdult()); }
  • 20. public void should_recognize_pediatric_patient() { // setup Patient sut = aPatient ().age(17).build(); // exercise and verify assertTrue (sut.isPediatric()); assertTrue (!sut.isAdult()); }
  • 21. public void should_recognize_pediatric_patient() { // setup Patient sut = aPatient ().age(17).build(); // exercise and verify assertTrue (sut.isPediatric()); assertTrue (!sut.isAdult()); } aPatient ().dob(april(1, 1992)).build();
  • 22. Add Patient to Care Team <ul><li>Patient must be registered at the same Facility as the Care Team. </li></ul><ul><li>Patient must meet the Care Team Membership Criteria (appropriate Age Category and Diagnosis). </li></ul>
  • 23. public class CareTeamMembershipService implements ICareTeamMembershipService { private CareTeamMembershipDao careTeamMembershipDao ; public void addMember(Patient patient, CareTeam careTeam) { if (!patient.isRegisteredAt(careTeam.getFacility())) { throw new CareTeamAdminException(); } if (!patient.meets(careTeam.getMembershipCriteria())) { throw new CareTeamAdminException(); } careTeamMembershipDao .create( patient.getId(), careTeam.getId()); } }
  • 24. private final CareTeamMembershipDao careTeamMembershipDao = context .mock(CareTeamMembershipDao. class ); private final ICareTeamMembershipService sut = createCareTeamMembershipService(); public void should_permit_add_for_appropriate_care_team() { // setup final Facility jacobi = aFacility ().build(); final Patient patient = aPatient ().at(jacobi).age(18) .with(Diagnosis. DIABETES ).build(); final CareTeam careTeam = anAdultCareTeam ().at(jacobi) .with(Diagnosis. DIABETES ).build(); // verify context .checking( new Expectations() {{ one( careTeamMembershipDao ).create( patient.getId(), careTeam.getId()); }}); // exercise sut .addMember(patient, careTeam); }
  • 25. private final CareTeamMembershipDao careTeamMembershipDao = context .mock(CareTeamMembershipDao. class ); private final ICareTeamMembershipService sut = createCareTeamMembershipService(); // verify @Test (expected=CareTeamAdminException. class ) public void should_disallow_add_adult_to_pediatric_care_team() { // setup final Facility jacobi = aFacility ().build(); final Patient patient = aPatient ().at(jacobi).age(18) . with (Diagnosis. DIABETES ).build(); final CareTeam careTeam = aPediatricCareTeam ().at(jacobi) .with(Diagnosis. DIABETES ).build(); // exercise sut .addMember(patient, careTeam); }
  • 26. Examples <ul><li>Test vs Production API </li></ul><ul><li>Builders as shared test asset </li></ul><ul><li>Mocks and Builders as Firewalls </li></ul>
  • 27. When to Use Mocks
  • 28. Mocks Builders
  • 29. Protocol Data
  • 30. Protocol => Mocks Data => Builders
  • 31. Now What? <ul><li>Read xUnit Test Patterns </li></ul><ul><li>Read Nat Pryce’s Builder posts </li></ul><ul><li>Distinguish Protocol vs Data </li></ul><ul><li>Try using Mocks with Builders </li></ul>
  • 32.  
  • 33.  
  • 34. Contact <ul><li>Jason Cheong-Kee-You </li></ul><ul><li>[email_address] </li></ul><ul><li>Alistair McKinnell </li></ul><ul><li>[email_address] </li></ul>
  • 35. Resources <ul><li>xUnit Test Patterns </li></ul><ul><li>http://xunitpatterns.com/ </li></ul><ul><li>jMock </li></ul><ul><li>http://www.jmock.org/ </li></ul><ul><li>Test Data Builders </li></ul><ul><li>http://nat.truemesh.com/archives/000714.html </li></ul>
  • 36. Credits Obstacle Race http://www.flickr.com/photos/foxypar4/1004464889/ Einstein Blackboard Writing Generator http://generator.kitt.net/2006/12/ einstein-blackboard-writing-generator.html Holy Grail http://www.flickr.com/photos/ spiritual_marketplace/2207966935/
  • 37.  

×