struggling to create maintainable unit tests?
DESCRIPTION
Learn how to create maintainable unit tests by using jMock with Test Data Builders.TRANSCRIPT
![Page 1: Struggling to Create Maintainable Unit Tests?](https://reader034.vdocuments.mx/reader034/viewer/2022051411/546b288baf795902048b5588/html5/thumbnails/1.jpg)
![Page 2: Struggling to Create Maintainable Unit Tests?](https://reader034.vdocuments.mx/reader034/viewer/2022051411/546b288baf795902048b5588/html5/thumbnails/2.jpg)
![Page 3: Struggling to Create Maintainable Unit Tests?](https://reader034.vdocuments.mx/reader034/viewer/2022051411/546b288baf795902048b5588/html5/thumbnails/3.jpg)
Protocol => Mocks
Data => Builders
![Page 4: Struggling to Create Maintainable Unit Tests?](https://reader034.vdocuments.mx/reader034/viewer/2022051411/546b288baf795902048b5588/html5/thumbnails/4.jpg)
Roadmap
• Define Maintainable Unit Test
• Create a Shared Vocabulary
• Examples
• When to Use Mocks
![Page 5: Struggling to Create Maintainable Unit Tests?](https://reader034.vdocuments.mx/reader034/viewer/2022051411/546b288baf795902048b5588/html5/thumbnails/5.jpg)
DefineMaintainable
Unit Test
![Page 6: Struggling to Create Maintainable Unit Tests?](https://reader034.vdocuments.mx/reader034/viewer/2022051411/546b288baf795902048b5588/html5/thumbnails/6.jpg)
10% of Unit Tests Break
If you really have a lot of unit tests, the amount of investment you'll have to makein 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
![Page 7: Struggling to Create Maintainable Unit Tests?](https://reader034.vdocuments.mx/reader034/viewer/2022051411/546b288baf795902048b5588/html5/thumbnails/7.jpg)
Maintainable Unit Tests
The benefits of unit tests outweigh the costs as a codebase evolves.
![Page 8: Struggling to Create Maintainable Unit Tests?](https://reader034.vdocuments.mx/reader034/viewer/2022051411/546b288baf795902048b5588/html5/thumbnails/8.jpg)
SharedVocabulary
![Page 9: Struggling to Create Maintainable Unit Tests?](https://reader034.vdocuments.mx/reader034/viewer/2022051411/546b288baf795902048b5588/html5/thumbnails/9.jpg)
Mocks
Builders
![Page 10: Struggling to Create Maintainable Unit Tests?](https://reader034.vdocuments.mx/reader034/viewer/2022051411/546b288baf795902048b5588/html5/thumbnails/10.jpg)
![Page 11: Struggling to Create Maintainable Unit Tests?](https://reader034.vdocuments.mx/reader034/viewer/2022051411/546b288baf795902048b5588/html5/thumbnails/11.jpg)
xUnit Test Patterns
![Page 12: Struggling to Create Maintainable Unit Tests?](https://reader034.vdocuments.mx/reader034/viewer/2022051411/546b288baf795902048b5588/html5/thumbnails/12.jpg)
Mocks
Builders
![Page 13: Struggling to Create Maintainable Unit Tests?](https://reader034.vdocuments.mx/reader034/viewer/2022051411/546b288baf795902048b5588/html5/thumbnails/13.jpg)
Mock Object
A mock object is a simulated object that mimics the behaviour of a real object in controlled ways.
![Page 14: Struggling to Create Maintainable Unit Tests?](https://reader034.vdocuments.mx/reader034/viewer/2022051411/546b288baf795902048b5588/html5/thumbnails/14.jpg)
Test Data Builder
• Builder Pattern
• build() method
• Default values
• Chainable configuration methods
![Page 15: Struggling to Create Maintainable Unit Tests?](https://reader034.vdocuments.mx/reader034/viewer/2022051411/546b288baf795902048b5588/html5/thumbnails/15.jpg)
Shared Vocabulary
• 4–Phase Test
• System Under Test
• Depended–On Component
• Mock Objects
• Test Data Builders
![Page 16: Struggling to Create Maintainable Unit Tests?](https://reader034.vdocuments.mx/reader034/viewer/2022051411/546b288baf795902048b5588/html5/thumbnails/16.jpg)
Examples
![Page 17: Struggling to Create Maintainable Unit Tests?](https://reader034.vdocuments.mx/reader034/viewer/2022051411/546b288baf795902048b5588/html5/thumbnails/17.jpg)
![Page 18: Struggling to Create Maintainable Unit Tests?](https://reader034.vdocuments.mx/reader034/viewer/2022051411/546b288baf795902048b5588/html5/thumbnails/18.jpg)
Domain Model
![Page 19: Struggling to Create Maintainable Unit Tests?](https://reader034.vdocuments.mx/reader034/viewer/2022051411/546b288baf795902048b5588/html5/thumbnails/19.jpg)
public void should_recognize_pediatric_patient(){ // setup Patient sut = aPatient().age(17).build();
// exercise and verify assertTrue(sut.isPediatric()); assertTrue(!sut.isAdult());}
![Page 20: Struggling to Create Maintainable Unit Tests?](https://reader034.vdocuments.mx/reader034/viewer/2022051411/546b288baf795902048b5588/html5/thumbnails/20.jpg)
public void should_recognize_pediatric_patient(){ // setup Patient sut = aPatient().age(17).build();
// exercise and verify assertTrue(sut.isPediatric()); assertTrue(!sut.isAdult());}
![Page 21: Struggling to Create Maintainable Unit Tests?](https://reader034.vdocuments.mx/reader034/viewer/2022051411/546b288baf795902048b5588/html5/thumbnails/21.jpg)
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();
![Page 22: Struggling to Create Maintainable Unit Tests?](https://reader034.vdocuments.mx/reader034/viewer/2022051411/546b288baf795902048b5588/html5/thumbnails/22.jpg)
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).
![Page 23: Struggling to Create Maintainable Unit Tests?](https://reader034.vdocuments.mx/reader034/viewer/2022051411/546b288baf795902048b5588/html5/thumbnails/23.jpg)
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()); }
}
![Page 24: Struggling to Create Maintainable Unit Tests?](https://reader034.vdocuments.mx/reader034/viewer/2022051411/546b288baf795902048b5588/html5/thumbnails/24.jpg)
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);}
![Page 25: Struggling to Create Maintainable Unit Tests?](https://reader034.vdocuments.mx/reader034/viewer/2022051411/546b288baf795902048b5588/html5/thumbnails/25.jpg)
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);}
![Page 26: Struggling to Create Maintainable Unit Tests?](https://reader034.vdocuments.mx/reader034/viewer/2022051411/546b288baf795902048b5588/html5/thumbnails/26.jpg)
Examples
• Test vs Production API
• Builders as shared test asset
• Mocks and Builders as Firewalls
![Page 27: Struggling to Create Maintainable Unit Tests?](https://reader034.vdocuments.mx/reader034/viewer/2022051411/546b288baf795902048b5588/html5/thumbnails/27.jpg)
When to Use Mocks
![Page 28: Struggling to Create Maintainable Unit Tests?](https://reader034.vdocuments.mx/reader034/viewer/2022051411/546b288baf795902048b5588/html5/thumbnails/28.jpg)
Mocks
Builders
![Page 29: Struggling to Create Maintainable Unit Tests?](https://reader034.vdocuments.mx/reader034/viewer/2022051411/546b288baf795902048b5588/html5/thumbnails/29.jpg)
Protocol
Data
![Page 30: Struggling to Create Maintainable Unit Tests?](https://reader034.vdocuments.mx/reader034/viewer/2022051411/546b288baf795902048b5588/html5/thumbnails/30.jpg)
Protocol => Mocks
Data => Builders
![Page 31: Struggling to Create Maintainable Unit Tests?](https://reader034.vdocuments.mx/reader034/viewer/2022051411/546b288baf795902048b5588/html5/thumbnails/31.jpg)
Now What?
• Read xUnit Test Patterns
• Read Nat Pryce’s Builder posts
• Distinguish Protocol vs Data
• Try using Mocks with Builders
![Page 32: Struggling to Create Maintainable Unit Tests?](https://reader034.vdocuments.mx/reader034/viewer/2022051411/546b288baf795902048b5588/html5/thumbnails/32.jpg)
![Page 33: Struggling to Create Maintainable Unit Tests?](https://reader034.vdocuments.mx/reader034/viewer/2022051411/546b288baf795902048b5588/html5/thumbnails/33.jpg)
![Page 35: Struggling to Create Maintainable Unit Tests?](https://reader034.vdocuments.mx/reader034/viewer/2022051411/546b288baf795902048b5588/html5/thumbnails/35.jpg)
Resources
xUnit Test Patternshttp://xunitpatterns.com/
jMockhttp://www.jmock.org/
Test Data Buildershttp://nat.truemesh.com/archives/000714.html
![Page 36: Struggling to Create Maintainable Unit Tests?](https://reader034.vdocuments.mx/reader034/viewer/2022051411/546b288baf795902048b5588/html5/thumbnails/36.jpg)
Credits
Obstacle Racehttp://www.flickr.com/photos/foxypar4/1004464889/
Einstein Blackboard Writing Generatorhttp://generator.kitt.net/2006/12/einstein-blackboard-writing-generator.html
Holy Grailhttp://www.flickr.com/photos/spiritual_marketplace/2207966935/
![Page 37: Struggling to Create Maintainable Unit Tests?](https://reader034.vdocuments.mx/reader034/viewer/2022051411/546b288baf795902048b5588/html5/thumbnails/37.jpg)