Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

TDD mit JUnit und Mockito

388 views

Published on

Einführung in testgetriebene Software-Entwicklung mit JUnit und Mockito.

Published in: Software
  • Be the first to comment

TDD mit JUnit und Mockito

  1. 1. 1 TDD mit JUnit & Mockito Tobias Trelle, codecentric AG @tobiastrelle
  2. 2. Tobias Trelle Software Architekt @ codecentric AG Twitter: @tobiastrelle Slideshare:  GitHub:  http://de.slideshare.net/tobiastrelle/ https://github.com/ttrelle
  3. 3. 2 3 Agenda TDD - Test Driven Development JUnit Mockito Zusammen in Aktion!
  4. 4. 4 Tests should be written FIRST Fast: Einzeln und in Summe schnell ausführbar Isolated: Unabhängig voneinander und externen Faktoren Repeatable: Immer gleiche Ergebnisse liefern Self-validating: Test-Ergebnis ist ohne menschl. Aufsicht feststellbar Timely: Zeitnah
  5. 5. 5 . 1 TDD Test Driven Development
  6. 6. 5 . 2 TDD Lifecycle
  7. 7. 5 . 3 TDD Lifecycle Red --> Green: Minimale Implementierung / "Fake it" Refactor: Code-Duplikation beseitigen Green --> Red: neuer Test Stets kleine bis kleinste Iterationen, diese führen zu Verallgemeinerungen
  8. 8. 5 . 4 Vorteile von TDD Schnelles Feedback Hohe Test-Abdeckung Code ist testbar Sicherheit bei Refactorings Testfall als Spezifikation der Implementierung
  9. 9. Literatur
  10. 10. 5 . 5
  11. 11. 6 . 1 JUnit http://junit.org
  12. 12. 6 . 2 JUnit Java-Implementierung von xUnit Test Framework Defacto-Standard im Java-Bereich
  13. 13. 6 . 3 Aktuelle stabile Version: 4.12 <dependency> <groupid>junit</groupid> <artifactid>junit</artifactid> <version>4.12</version> <scope>test</scope> </dependency>
  14. 14. 6 . 4 JUnit Features Defintion von Test Fixtures Test-Ausführung Assertions Rules Definition Test-Suiten Integration in IDE / CI-Build
  15. 15. 6 . 5 JUnit - Einfaches Beispiel public class VnrGeneratorTest { private VnrGenerator generator; /** Unit under test. */ private LocalDateTime stichtag; /** Fixture */ @Before public void setUp() { generator = new VnrGenerator(); stichtag = LocalDateTime.of(2017, Month.FEBRUARY, 17, 0, 0); } @Test public void vnr_erzeugung() { // gegeben sei String sachgebiet = "LN"; String name = "Fasel"; // wenn String vnr = generator.neueVnr(sachgebiet, stichtag, name); // dann assertThat(vnr, is("LN-20170217-F001")); } }
  16. 16. 6 . 6 TDD Live Coding #1
  17. 17. 7 . 1 Mockito http://site.mockito.org/
  18. 18. Tasty mocking framework for unit tests in Java  to mock: etwas vortäuschen
  19. 19. 7 . 2 7 . 3 Aktuelle stabile Version: 2.7.15 <dependency> <groupid>org.mockito</groupid> <artifactid>mockito-core</artifactid> <version>2.7.15</version> <scope>test</scope> </dependency>
  20. 20. 7 . 4 Mockito Features Mocking Spying Captors Verifying
  21. 21. 7 . 5 Mocken von Abhängigkeiten
  22. 22. VnrGenerator benötigt VnrDao public class VnrGenerator { private VnrDao dao; public VnrGenerator(VnrDao dao) { this.dao = dao; } public String neueVnr(String sachgebiet, LocalDate stichtag, String final String sgDatum = // sachgebiet + "-" + // stichtag.format(DateTimeFormatter.ISO_LOCAL_DATE); final String ersterBuchstabe = nachname.substring(0,1); final int lnr = ermittleLaufnummerZu(stichtag, ersterBuchstabe); return sgDatum + "-" + String.format("%s%03d", ersterBuchstabe, lnr); } private int ermittleLaufnummerZu(LocalDate stichtag, String ersterBuchsta return dao.naechsteFreiLaufnummer(stichtag, ersterBuchstabe); } }
  23. 23. 7 . 6 Mockito Fixture @RunWith(MockitoJUnitRunner.class) public class VnrGeneratorTest { @Mock private VnrDao daoMock; private VnrGenerator generator; /** Unit under test. */ private LocalDate stichtag; /** Fixture */ @Before public void setUp() { generator = new VnrGenerator(daoMock); stichtag = LocalDate.of(2017, Month.FEBRUARY, 28); } ... }
  24. 24. 7 . 7 Mockito im Testfall @Test public void vnr_erzeugung() { // gegeben sei String sachgebiet = "LN"; String name = "Fasel"; when( daoMock.naechsteFreiLaufnummer(stichtag, "F") ).thenReturn(1); // wenn String vnr = generator.neueVnr(sachgebiet, stichtag, name); // dann verify(daoMock).naechsteFreiLaufnummer(stichtag, "F"); verifyNoMoreInteractions(daoMock); assertThat(vnr, is("LN-2017-02-28-F001")); }
  25. 25. 7 . 8 Mockito im Testfall - BDD Style @Test public void vnr_erzeugung() { // gegeben sei String sachgebiet = "LN"; String name = "Fasel"; given( daoMock.naechsteFreiLaufnummer(stichtag, "F") ) .willReturn(1); // wenn String vnr = generator.neueVnr(sachgebiet, stichtag, name); // dann then(daoMock).should().naechsteFreiLaufnummer(stichtag, "F"); then(daoMock).shouldHaveNoMoreInteractions(); assertThat(vnr, is("LN-2017-02-28-F001")); }
  26. 26. 7 . 9 7 . 10 TDD Live Coding #2
  27. 27. 7 . 11 Grenzen von Mockito Finale Klassen / Methoden Statische Methoden Abhilfe: PowerMock für Mockito
  28. 28. TDD mit JUnit & Mockito - Tobias Trelle, codecentric AG 8 Danke für Ihre Aufmerksamkeit Tobias Trelle, codecentric AG @tobiastrelle 

×