testdrevet javautvikling på objektorienterte skinner
TRANSCRIPT
![Page 1: Testdrevet javautvikling på objektorienterte skinner](https://reader033.vdocuments.mx/reader033/viewer/2022052911/559f68f11a28ab081e8b458a/html5/thumbnails/1.jpg)
testdrevet javautvikling
på objektorienterteskinner
Anders Sveen og Truls JørgensenJavaZoneX
![Page 2: Testdrevet javautvikling på objektorienterte skinner](https://reader033.vdocuments.mx/reader033/viewer/2022052911/559f68f11a28ab081e8b458a/html5/thumbnails/2.jpg)
![Page 3: Testdrevet javautvikling på objektorienterte skinner](https://reader033.vdocuments.mx/reader033/viewer/2022052911/559f68f11a28ab081e8b458a/html5/thumbnails/3.jpg)
Java er ikke morsomt eller sexy
![Page 4: Testdrevet javautvikling på objektorienterte skinner](https://reader033.vdocuments.mx/reader033/viewer/2022052911/559f68f11a28ab081e8b458a/html5/thumbnails/4.jpg)
Java7 er ikke morsomt eller sexy
![Page 5: Testdrevet javautvikling på objektorienterte skinner](https://reader033.vdocuments.mx/reader033/viewer/2022052911/559f68f11a28ab081e8b458a/html5/thumbnails/5.jpg)
![Page 6: Testdrevet javautvikling på objektorienterte skinner](https://reader033.vdocuments.mx/reader033/viewer/2022052911/559f68f11a28ab081e8b458a/html5/thumbnails/6.jpg)
![Page 7: Testdrevet javautvikling på objektorienterte skinner](https://reader033.vdocuments.mx/reader033/viewer/2022052911/559f68f11a28ab081e8b458a/html5/thumbnails/7.jpg)
![Page 8: Testdrevet javautvikling på objektorienterte skinner](https://reader033.vdocuments.mx/reader033/viewer/2022052911/559f68f11a28ab081e8b458a/html5/thumbnails/8.jpg)
![Page 9: Testdrevet javautvikling på objektorienterte skinner](https://reader033.vdocuments.mx/reader033/viewer/2022052911/559f68f11a28ab081e8b458a/html5/thumbnails/9.jpg)
![Page 10: Testdrevet javautvikling på objektorienterte skinner](https://reader033.vdocuments.mx/reader033/viewer/2022052911/559f68f11a28ab081e8b458a/html5/thumbnails/10.jpg)
hva du gjør er viktigere
![Page 11: Testdrevet javautvikling på objektorienterte skinner](https://reader033.vdocuments.mx/reader033/viewer/2022052911/559f68f11a28ab081e8b458a/html5/thumbnails/11.jpg)
![Page 12: Testdrevet javautvikling på objektorienterte skinner](https://reader033.vdocuments.mx/reader033/viewer/2022052911/559f68f11a28ab081e8b458a/html5/thumbnails/12.jpg)
rask oppstart
kjapp feedback
mindre kompleksitet
lett å integrere med tester
![Page 13: Testdrevet javautvikling på objektorienterte skinner](https://reader033.vdocuments.mx/reader033/viewer/2022052911/559f68f11a28ab081e8b458a/html5/thumbnails/13.jpg)
lite påtrengende
enkelt å utvide
enkelt å gå rundt
open source
![Page 14: Testdrevet javautvikling på objektorienterte skinner](https://reader033.vdocuments.mx/reader033/viewer/2022052911/559f68f11a28ab081e8b458a/html5/thumbnails/14.jpg)
![Page 15: Testdrevet javautvikling på objektorienterte skinner](https://reader033.vdocuments.mx/reader033/viewer/2022052911/559f68f11a28ab081e8b458a/html5/thumbnails/15.jpg)
![Page 16: Testdrevet javautvikling på objektorienterte skinner](https://reader033.vdocuments.mx/reader033/viewer/2022052911/559f68f11a28ab081e8b458a/html5/thumbnails/16.jpg)
en følelse av å være
produktiv
![Page 17: Testdrevet javautvikling på objektorienterte skinner](https://reader033.vdocuments.mx/reader033/viewer/2022052911/559f68f11a28ab081e8b458a/html5/thumbnails/17.jpg)
enkelt å legge til nye
features
![Page 18: Testdrevet javautvikling på objektorienterte skinner](https://reader033.vdocuments.mx/reader033/viewer/2022052911/559f68f11a28ab081e8b458a/html5/thumbnails/18.jpg)
![Page 19: Testdrevet javautvikling på objektorienterte skinner](https://reader033.vdocuments.mx/reader033/viewer/2022052911/559f68f11a28ab081e8b458a/html5/thumbnails/19.jpg)
![Page 20: Testdrevet javautvikling på objektorienterte skinner](https://reader033.vdocuments.mx/reader033/viewer/2022052911/559f68f11a28ab081e8b458a/html5/thumbnails/20.jpg)
endringsdyktig
objektorientertkode
![Page 21: Testdrevet javautvikling på objektorienterte skinner](https://reader033.vdocuments.mx/reader033/viewer/2022052911/559f68f11a28ab081e8b458a/html5/thumbnails/21.jpg)
isolasjon
ansvarsdeling
![Page 22: Testdrevet javautvikling på objektorienterte skinner](https://reader033.vdocuments.mx/reader033/viewer/2022052911/559f68f11a28ab081e8b458a/html5/thumbnails/22.jpg)
if (soknad.getStatus().equals(VENTER)) {
soknad.setGodkjentDato(new Date());
soknad.setStatus(GODKJENT);
}
VS
if (soknad.kanGodkjennes()) {
soknad.godkjenn();
}
![Page 23: Testdrevet javautvikling på objektorienterte skinner](https://reader033.vdocuments.mx/reader033/viewer/2022052911/559f68f11a28ab081e8b458a/html5/thumbnails/23.jpg)
@Test
public skalTesteGodkjenning() {
}
![Page 24: Testdrevet javautvikling på objektorienterte skinner](https://reader033.vdocuments.mx/reader033/viewer/2022052911/559f68f11a28ab081e8b458a/html5/thumbnails/24.jpg)
@Test
public skalTesteGodkjenning() {
PersonRepository personRepo =
mock(PersonRepository.class);
when(personRepo)
.getPerson(any(Long))
.returnValue(TestDataProvider
.standardPerson().build());
}
![Page 25: Testdrevet javautvikling på objektorienterte skinner](https://reader033.vdocuments.mx/reader033/viewer/2022052911/559f68f11a28ab081e8b458a/html5/thumbnails/25.jpg)
@Test
public skalTesteGodkjenning() {
PersonRepository personRepo =
mock(PersonRepository.class);
when(personRepo)
.getPerson(any(Long))
.returnValue(TestDataProvider
.standardPerson().build());
SoknadService service =
new SoknadServiceImpl(personRepo);
Soknad soknad = TestDataProvider
.standardSoknad()
.status(GODKJENT).build();
}
![Page 26: Testdrevet javautvikling på objektorienterte skinner](https://reader033.vdocuments.mx/reader033/viewer/2022052911/559f68f11a28ab081e8b458a/html5/thumbnails/26.jpg)
@Test
public skalTesteGodkjenning() {
PersonRepository personRepo =
mock(PersonRepository.class);
when(personRepo)
.getPerson(any(Long))
.returnValue(TestDataProvider
.standardPerson().build());
SoknadService service =
new SoknadServiceImpl(personRepo);
Soknad soknad = TestDataProvider
.standardSoknad()
.status(GODKJENT).build();
assertFalse(service.godkjennSoknad(soknad));
}
![Page 27: Testdrevet javautvikling på objektorienterte skinner](https://reader033.vdocuments.mx/reader033/viewer/2022052911/559f68f11a28ab081e8b458a/html5/thumbnails/27.jpg)
@Test
public void skalTesteGodkjenning() {
Soknad soknad =
TestDataProvider
.standardSoknad()
.godkjent().build();
assertFalse(soknad.kanGodkjennes());
}
![Page 28: Testdrevet javautvikling på objektorienterte skinner](https://reader033.vdocuments.mx/reader033/viewer/2022052911/559f68f11a28ab081e8b458a/html5/thumbnails/28.jpg)
public class OrganizationNumber {
@NotBlank
@Digits(integer=9, fraction=0)
@Min(value=100000000)
@ValidOrganizationNumber
private String value;
}
@Valid
private OrganizationNumber organizationNumber;
![Page 29: Testdrevet javautvikling på objektorienterte skinner](https://reader033.vdocuments.mx/reader033/viewer/2022052911/559f68f11a28ab081e8b458a/html5/thumbnails/29.jpg)
public class OrganizationNumber {
@NotBlank
@Digits(integer=9, fraction=0)
@Min(value=100000000)
@ValidOrganizationNumber
private String value;
}
@Valid
@NotNull(groups=GodkjennSoknadContext.class)
private OrganizationNumber organizationNumber;
![Page 30: Testdrevet javautvikling på objektorienterte skinner](https://reader033.vdocuments.mx/reader033/viewer/2022052911/559f68f11a28ab081e8b458a/html5/thumbnails/30.jpg)
@RequestMapping(method =
RequestMethod.POST)
public String registerOrganization(
@Valid @ModelAttribute
Organization organization,
Errors errors) {
...
}
![Page 31: Testdrevet javautvikling på objektorienterte skinner](https://reader033.vdocuments.mx/reader033/viewer/2022052911/559f68f11a28ab081e8b458a/html5/thumbnails/31.jpg)
trygghettil å gjøre endringer
![Page 32: Testdrevet javautvikling på objektorienterte skinner](https://reader033.vdocuments.mx/reader033/viewer/2022052911/559f68f11a28ab081e8b458a/html5/thumbnails/32.jpg)
![Page 33: Testdrevet javautvikling på objektorienterte skinner](https://reader033.vdocuments.mx/reader033/viewer/2022052911/559f68f11a28ab081e8b458a/html5/thumbnails/33.jpg)
lettå skrive tester
![Page 34: Testdrevet javautvikling på objektorienterte skinner](https://reader033.vdocuments.mx/reader033/viewer/2022052911/559f68f11a28ab081e8b458a/html5/thumbnails/34.jpg)
Organization org =
OrganizationTestDataProvider
.defaultOrganization();
![Page 35: Testdrevet javautvikling på objektorienterte skinner](https://reader033.vdocuments.mx/reader033/viewer/2022052911/559f68f11a28ab081e8b458a/html5/thumbnails/35.jpg)
Organization org =
OrganizationTestDataProvider
.defaultOrganization()
.name(”¤Invalid")
.build();
![Page 36: Testdrevet javautvikling på objektorienterte skinner](https://reader033.vdocuments.mx/reader033/viewer/2022052911/559f68f11a28ab081e8b458a/html5/thumbnails/36.jpg)
Organization org =
OrganizationTestDataProvider
.defaultOrganization()
.withoutEmployees()
.build();
![Page 37: Testdrevet javautvikling på objektorienterte skinner](https://reader033.vdocuments.mx/reader033/viewer/2022052911/559f68f11a28ab081e8b458a/html5/thumbnails/37.jpg)
Organization org =
OrganizationTestDataProvider
.defaultOrganization ()
.withoutEmployees()
.build(entityManager);
![Page 38: Testdrevet javautvikling på objektorienterte skinner](https://reader033.vdocuments.mx/reader033/viewer/2022052911/559f68f11a28ab081e8b458a/html5/thumbnails/38.jpg)
![Page 39: Testdrevet javautvikling på objektorienterte skinner](https://reader033.vdocuments.mx/reader033/viewer/2022052911/559f68f11a28ab081e8b458a/html5/thumbnails/39.jpg)
@RequestMapping(method = RequestMethod.POST)
public String registerRequestInformation(
@Valid @ModelAttribute
InformationRequest informationRequest,
Errors errors) {
}
![Page 40: Testdrevet javautvikling på objektorienterte skinner](https://reader033.vdocuments.mx/reader033/viewer/2022052911/559f68f11a28ab081e8b458a/html5/thumbnails/40.jpg)
@RequestMapping(method = RequestMethod.POST)
public String registerRequestInformation(
@Valid @ModelAttribute
InformationRequest informationRequest,
Errors errors) {
this.orgRepo
.addInformationRequest(informationRequest);
}
![Page 41: Testdrevet javautvikling på objektorienterte skinner](https://reader033.vdocuments.mx/reader033/viewer/2022052911/559f68f11a28ab081e8b458a/html5/thumbnails/41.jpg)
@RequestMapping(method = RequestMethod.POST)
public String registerRequestInformation(
@Valid @ModelAttribute
InformationRequest informationRequest,
Errors errors) {
if (errors.hasErrors()) {
return VIEW_INFORMATION_REQUEST_FORM;
}
this.orgRepo
.addInformationRequest(informationRequest);
}
![Page 42: Testdrevet javautvikling på objektorienterte skinner](https://reader033.vdocuments.mx/reader033/viewer/2022052911/559f68f11a28ab081e8b458a/html5/thumbnails/42.jpg)
@RequestMapping(method = RequestMethod.POST)
public String registerRequestInformation(
@Valid @ModelAttribute
InformationRequest informationRequest,
Errors errors) {
if (errors.hasErrors()) {
return VIEW_INFORMATION_REQUEST_FORM;
}
this.orgRepo
.addInformationRequest(informationRequest);
return redirectTo(URL_INFORMATION_REQUEST);
}
![Page 43: Testdrevet javautvikling på objektorienterte skinner](https://reader033.vdocuments.mx/reader033/viewer/2022052911/559f68f11a28ab081e8b458a/html5/thumbnails/43.jpg)
@RequestMapping(method = RequestMethod.GET,
value = ”ir/{requestId}/received”)
public String registerRequestAsReceived(
@PathVariable Long requestId ) {
InformationRequest informationRequest =
this.orgRepo
.getInformationRequest( requestId );
informationRequest.received();
return redirectTo(
url("/", URL_INFORMATION_REQUEST));
}
![Page 44: Testdrevet javautvikling på objektorienterte skinner](https://reader033.vdocuments.mx/reader033/viewer/2022052911/559f68f11a28ab081e8b458a/html5/thumbnails/44.jpg)
@RequestMapping(method = RequestMethod.GET,
value = ”ir/{requestId}/received”)
public @ResponseBody InformationRequest
registerRequestAsReceived(
@PathVariable Long requestId) {
InformationRequest informationRequest =
this.orgRepo
.getInformationRequest(requestId);
return informationRequest;
}
![Page 45: Testdrevet javautvikling på objektorienterte skinner](https://reader033.vdocuments.mx/reader033/viewer/2022052911/559f68f11a28ab081e8b458a/html5/thumbnails/45.jpg)
oppsummert:
![Page 46: Testdrevet javautvikling på objektorienterte skinner](https://reader033.vdocuments.mx/reader033/viewer/2022052911/559f68f11a28ab081e8b458a/html5/thumbnails/46.jpg)
github.com/anderssv/jzx-weboo
![Page 47: Testdrevet javautvikling på objektorienterte skinner](https://reader033.vdocuments.mx/reader033/viewer/2022052911/559f68f11a28ab081e8b458a/html5/thumbnails/47.jpg)
http://nat.truemesh.com/archives/000714.html
http://martinfowler.com/bliki/ObjectMother.html
http://docs.codehaus.org/display/JETTY/Embedding+Jetty
http://jcp.org/en/jsr/detail?id=303
http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html
Testdata builders
Object mother
Jetty embedded
JSR 303
Spring MVC
![Page 48: Testdrevet javautvikling på objektorienterte skinner](https://reader033.vdocuments.mx/reader033/viewer/2022052911/559f68f11a28ab081e8b458a/html5/thumbnails/48.jpg)
![Page 49: Testdrevet javautvikling på objektorienterte skinner](https://reader033.vdocuments.mx/reader033/viewer/2022052911/559f68f11a28ab081e8b458a/html5/thumbnails/49.jpg)
14.-15. novemberRadisson Blu Plaza, Oslo
http://smidig2011.no
![Page 50: Testdrevet javautvikling på objektorienterte skinner](https://reader033.vdocuments.mx/reader033/viewer/2022052911/559f68f11a28ab081e8b458a/html5/thumbnails/50.jpg)