Upload
tobias-trelle
View
73
Download
1
Embed Size (px)
Citation preview
1
TDDmit JUnit & MockitoTobias Trelle, codecentric AG
@tobiastrelle
2
Tobias Trelle
Software Architekt @ codecentric AG
Twitter: @tobiastrelle
Slideshare:
GitHub:
http://de.slideshare.net/tobiastrelle/
https://github.com/ttrelle
2
3
AgendaTDD - Test Driven Development
JUnit
Mockito
Zusammen in Aktion!
4
Tests should be written FIRSTFast: 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 . 1
TDDTest Driven Development
5 . 2
TDD Lifecycle
5 . 3
TDD LifecycleRed --> Green: Minimale Implementierung / "Fake it"
Refactor: Code-Duplikation beseitigen
Green --> Red: neuer Test
Stets kleine bis kleinste Iterationen, diese führen zu
Verallgemeinerungen
5 . 4
Vorteile von TDDSchnelles Feedback
Hohe Test-Abdeckung
Code ist testbar
Sicherheit bei Refactorings
Testfall als Spezifikation der Implementierung
Literatur
5 . 5
6 . 2
JUnitJava-Implementierung von xUnit
Test Framework
Defacto-Standard im Java-Bereich
6 . 3
Aktuelle stabile Version: 4.12
<dependency> <groupid>junit</groupid> <artifactid>junit</artifactid> <version>4.12</version> <scope>test</scope> </dependency>
6 . 4
JUnit FeaturesDefintion von Test Fixtures
Test-Ausführung
Assertions
Rules
Definition Test-Suiten
Integration in IDE / CI-Build
6 . 5
JUnit - Einfaches Beispielpublic 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 . 6
TDD Live Coding #1
7 . 2
Tasty mocking framework for unit tests in Java
to mock: etwas vortäuschen
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>
7 . 4
Mockito FeaturesMocking
Spying
Captors
Verifying
7 . 5
Mocken von Abhängigkeiten
7 . 6
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 ersterBuchstabe) { return dao.naechsteFreiLaufnummer(stichtag, ersterBuchstabe); }
}
7 . 6
7 . 7
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
7 . 8
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
7 . 9
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
7 . 10
TDD Live Coding #2
7 . 11
Grenzen von MockitoFinale Klassen / Methoden
Statische Methoden
Abhilfe: PowerMock für Mockito
TDD mit JUnit & Mockito - Tobias Trelle, codecentric AG 8
Danke für Ihre AufmerksamkeitTobias Trelle, codecentric AG
@tobiastrelle