Se ha denunciado esta presentación.

Testdrevet javautvikling på objektorienterte skinner

1

Compartir

Próximo SlideShare
SOLID Principles
SOLID Principles
Cargando en…3
×
1 de 50
1 de 50

Más Contenido Relacionado

Audiolibros relacionados

Gratis con una prueba de 30 días de Scribd

Ver todo

Testdrevet javautvikling på objektorienterte skinner

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

Notas del editor

  • A
  • A -> T
  • T
  • T
  • T
  • T
  • A
  • T
  • T Eiappserveren
  • A
  • A & T
  • A
  • T
  • A
  • T
  • A
  • T
  • T
  • A
  • A
  • T
  • T
  • A
  • A
  • A
  • A
  • T
  • T
  • A
  • AVis app med 2 forhåndsinnlagterequestsSteng den eneVis kjøring av tester (påpek Jetty)Endre controllerVis kjøring med plugin (JUnitMax og Infinitest)Vis applikasjon med å legge innVis at close ikke fungererFiks closeKjør grønt
  • T
  • T
  • T
  • T
  • T
  • T -> A
  • A
  • A
  • A
  • A
  • T
  • A
  • A & T
  • T
  • A
  • ×