50
testdrevet javautvikling objektorienterte skinner Anders Sveen og Truls Jørgensen JavaZoneX

Testdrevet javautvikling på objektorienterte skinner

Embed Size (px)

Citation preview

Page 1: Testdrevet javautvikling på objektorienterte skinner

testdrevet javautvikling

på objektorienterteskinner

Anders Sveen og Truls JørgensenJavaZoneX

Page 2: Testdrevet javautvikling på objektorienterte skinner
Page 3: Testdrevet javautvikling på objektorienterte skinner

Java er ikke morsomt eller sexy

Page 4: Testdrevet javautvikling på objektorienterte skinner

Java7 er ikke morsomt eller sexy

Page 5: Testdrevet javautvikling på objektorienterte skinner
Page 6: Testdrevet javautvikling på objektorienterte skinner
Page 7: Testdrevet javautvikling på objektorienterte skinner
Page 8: Testdrevet javautvikling på objektorienterte skinner
Page 9: Testdrevet javautvikling på objektorienterte skinner
Page 10: Testdrevet javautvikling på objektorienterte skinner

hva du gjør er viktigere

Page 11: Testdrevet javautvikling på objektorienterte skinner
Page 12: Testdrevet javautvikling på objektorienterte skinner

rask oppstart

kjapp feedback

mindre kompleksitet

lett å integrere med tester

Page 13: Testdrevet javautvikling på objektorienterte skinner

lite påtrengende

enkelt å utvide

enkelt å gå rundt

open source

Page 14: Testdrevet javautvikling på objektorienterte skinner
Page 15: Testdrevet javautvikling på objektorienterte skinner
Page 16: Testdrevet javautvikling på objektorienterte skinner

en følelse av å være

produktiv

Page 17: Testdrevet javautvikling på objektorienterte skinner

enkelt å legge til nye

features

Page 18: Testdrevet javautvikling på objektorienterte skinner
Page 19: Testdrevet javautvikling på objektorienterte skinner
Page 20: Testdrevet javautvikling på objektorienterte skinner

endringsdyktig

objektorientertkode

Page 21: Testdrevet javautvikling på objektorienterte skinner

isolasjon

ansvarsdeling

Page 22: Testdrevet javautvikling på objektorienterte skinner

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

@Test

public skalTesteGodkjenning() {

}

Page 24: Testdrevet javautvikling på objektorienterte skinner

@Test

public skalTesteGodkjenning() {

PersonRepository personRepo =

mock(PersonRepository.class);

when(personRepo)

.getPerson(any(Long))

.returnValue(TestDataProvider

.standardPerson().build());

}

Page 25: Testdrevet javautvikling på objektorienterte skinner

@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

@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

@Test

public void skalTesteGodkjenning() {

Soknad soknad =

TestDataProvider

.standardSoknad()

.godkjent().build();

assertFalse(soknad.kanGodkjennes());

}

Page 28: Testdrevet javautvikling på objektorienterte skinner

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

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

@RequestMapping(method =

RequestMethod.POST)

public String registerOrganization(

@Valid @ModelAttribute

Organization organization,

Errors errors) {

...

}

Page 31: Testdrevet javautvikling på objektorienterte skinner

trygghettil å gjøre endringer

Page 32: Testdrevet javautvikling på objektorienterte skinner
Page 33: Testdrevet javautvikling på objektorienterte skinner

lettå skrive tester

Page 34: Testdrevet javautvikling på objektorienterte skinner

Organization org =

OrganizationTestDataProvider

.defaultOrganization();

Page 35: Testdrevet javautvikling på objektorienterte skinner

Organization org =

OrganizationTestDataProvider

.defaultOrganization()

.name(”¤Invalid")

.build();

Page 36: Testdrevet javautvikling på objektorienterte skinner

Organization org =

OrganizationTestDataProvider

.defaultOrganization()

.withoutEmployees()

.build();

Page 37: Testdrevet javautvikling på objektorienterte skinner

Organization org =

OrganizationTestDataProvider

.defaultOrganization ()

.withoutEmployees()

.build(entityManager);

Page 38: Testdrevet javautvikling på objektorienterte skinner
Page 39: Testdrevet javautvikling på objektorienterte skinner

@RequestMapping(method = RequestMethod.POST)

public String registerRequestInformation(

@Valid @ModelAttribute

InformationRequest informationRequest,

Errors errors) {

}

Page 40: Testdrevet javautvikling på objektorienterte skinner

@RequestMapping(method = RequestMethod.POST)

public String registerRequestInformation(

@Valid @ModelAttribute

InformationRequest informationRequest,

Errors errors) {

this.orgRepo

.addInformationRequest(informationRequest);

}

Page 41: Testdrevet javautvikling på objektorienterte skinner

@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

@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

@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

@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

oppsummert:

Page 46: Testdrevet javautvikling på objektorienterte skinner

github.com/anderssv/jzx-weboo

Page 47: Testdrevet javautvikling på objektorienterte skinner

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
Page 49: Testdrevet javautvikling på objektorienterte skinner

14.-15. novemberRadisson Blu Plaza, Oslo

http://smidig2011.no

Page 50: Testdrevet javautvikling på objektorienterte skinner