TDD mit JUnit & Mockito Tobias Trelle, codecentric AG @tobiastrelle 1
Tobias Trelle Software Architekt @ codecentric AG Twitter: @tobiastrelle Slideshare: http://de.slideshare.net/tobiastrelle/ GitHub: https://github.com/ttrelle
2 Agenda TDD - Test Driven Development JUnit Mockito Zusammen in Aktion! 3
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 4
TDD Test Driven Development 5. 1
TDD Lifecycle 5. 2
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 5. 3
Vorteile von TDD Schnelles Feedback Hohe Test-Abdeckung Code ist testbar Sicherheit bei Refactorings Testfall als Spezifikation der Implementierung 5. 4
Literatur
5. 5
JUnit http://junit.org 6. 1
JUnit Java-Implementierung von xunit Test Framework Defacto-Standard im Java-Bereich 6. 2
Aktuelle stabile Version: 4.12 <dependency> <groupid>junit</groupid> <artifactid>junit</artifactid> <version>4.12</version> <scope>test</scope> </dependency> 6. 3
JUnit Features Defintion von Test Fixtures Test-Ausführung Assertions Rules Definition Test-Suiten Integration in IDE / CI-Build 6. 4
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")); 6. 5
TDD Live Coding #1 6. 6
Mockito http://site.mockito.org/ 7. 1
Tasty mocking framework for unit tests in Java to mock: etwas vortäuschen
7. 2 Aktuelle stabile Version: 2.7.15 <dependency> <groupid>org.mockito</groupid> <artifactid>mockito-core</artifactid> <version>2.7.15</version> <scope>test</scope> </dependency> 7. 3
Mockito Features Mocking Spying Captors Verifying 7. 4
Mocken von Abhängigkeiten 7. 5
public class VnrGenerator { private VnrDao dao; VnrGenerator benötigt VnrDao public VnrGenerator(VnrDao dao) { this.dao = dao; } public String neuevnr(string sachgebiet, LocalDate stichtag, Stri final String sgdatum = // sachgebiet + "-" + // stichtag.format(datetimeformatter.iso_local_date); final String ersterbuchstabe = nachname.substring(0,1); final int lnr = ermittlelaufnummerzu(stichtag, ersterbuchstab } return sgdatum + "-" + String.format("%s%03d", ersterbuchstab private int ermittlelaufnummerzu(localdate stichtag, String erste return dao.naechstefreilaufnummer(stichtag, ersterbuchstabe); } }
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); }...
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"));
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"));
7. 9 TDD Live Coding #2 7. 10
Grenzen von Mockito Finale Klassen / Methoden Statische Methoden Abhilfe: PowerMock für Mockito 7. 11
Danke für Ihre Aufmerksamkeit Tobias Trelle, codecentric AG @tobiastrelle TDD mit JUnit & Mockito - Tobias Trelle, codecentric AG 8