1
TDD
mit JUnit & Mockito
Tobias Trelle, codecentric AG
@tobiastrelle
Tobias Trelle
Software Architekt @ codecentric AG
Twitter: @tobiastrelle
Slideshare: 
GitHub: 
http://de.slideshare.net/tobiastrelle/
https://github.com/ttrelle
2
3
Agenda
TDD - Test Driven Development
JUnit
Mockito
Zusammen in Aktion!
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 . 1
TDD
Test Driven Development
5 . 2
TDD Lifecycle
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
5 . 4
Vorteile von TDD
Schnelles Feedback
Hohe Test-Abdeckung
Code ist testbar
Sicherheit bei Refactorings
Testfall als Spezifikation der Implementierung
Literatur
5 . 5
6 . 1
JUnit
http://junit.org
6 . 2
JUnit
Java-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 Features
Defintion von Test Fixtures
Test-Ausführung
Assertions
Rules
Definition Test-Suiten
Integration in IDE / CI-Build
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"));
}
}
6 . 6
TDD Live Coding #1
7 . 1
Mockito
http://site.mockito.org/
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 Features
Mocking
Spying
Captors
Verifying
7 . 5
Mocken von Abhängigkeiten
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);
}
}
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
7 . 10
TDD Live Coding #2
7 . 11
Grenzen von Mockito
Finale Klassen / Methoden
Statische Methoden
Abhilfe: PowerMock für Mockito
TDD mit JUnit & Mockito - Tobias Trelle, codecentric AG 8
Danke für Ihre Aufmerksamkeit
Tobias Trelle, codecentric AG
@tobiastrelle 

TDD mit JUnit und Mockito