Struggling to Create Maintainable Unit Tests?
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

Struggling to Create Maintainable Unit Tests?

on

  • 4,246 views

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.

Statistics

Views

Total Views
4,246
Views on SlideShare
3,846
Embed Views
400

Actions

Likes
1
Downloads
39
Comments
0

7 Embeds 400

http://www.valuablecode.com 384
http://translate.googleusercontent.com 4
http://translate.googleusercontent.com 4
http://www.slideshare.net 3
http://www.linkedin.com 3
http://74.125.47.132 1
http://www.lmodules.com 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Struggling to Create Maintainable Unit Tests? Presentation Transcript

  • 1.  
  • 2.  
  • 3. Protocol => Mocks Data => Builders
  • 4. Roadmap
    • Define Maintainable Unit Test
    • Create a Shared Vocabulary
    • Examples
    • When to Use Mocks
  • 5. Define Maintainable Unit Test
  • 6. 10% of Unit Tests Break
    • 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.
    • — Joel Spolsky
  • 7. Maintainable Unit Tests
    • The benefits of unit tests outweigh the costs as a codebase evolves.
  • 8. Shared Vocabulary
  • 9. Mocks Builders
  • 10.  
  • 11. xUnit Test Patterns
  • 12. Mocks Builders
  • 13. Mock Object
    • A mock object is a simulated object that mimics the behaviour of a real object in controlled ways.
  • 14. Test Data Builder
    • Builder Pattern
    • build() method
    • Default values
    • Chainable configuration methods
  • 15. Shared Vocabulary
    • 4–Phase Test
    • System Under Test
    • Depended–On Component
    • Mock Objects
    • Test Data Builders
  • 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
    • Patient must be registered at the same Facility as the Care Team.
    • Patient must meet the Care Team Membership Criteria (appropriate Age Category and Diagnosis).
  • 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
    • Test vs Production API
    • Builders as shared test asset
    • Mocks and Builders as Firewalls
  • 27. When to Use Mocks
  • 28. Mocks Builders
  • 29. Protocol Data
  • 30. Protocol => Mocks Data => Builders
  • 31. Now What?
    • Read xUnit Test Patterns
    • Read Nat Pryce’s Builder posts
    • Distinguish Protocol vs Data
    • Try using Mocks with Builders
  • 32.  
  • 33.  
  • 34. Contact
    • Jason Cheong-Kee-You
    • [email_address]
    • Alistair McKinnell
    • [email_address]
  • 35. Resources
    • xUnit Test Patterns
    • http://xunitpatterns.com/
    • jMock
    • http://www.jmock.org/
    • Test Data Builders
    • http://nat.truemesh.com/archives/000714.html
  • 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.