SlideShare ist ein Scribd-Unternehmen logo
1 von 28
Downloaden Sie, um offline zu lesen
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 

Weitere ähnliche Inhalte

Andere mochten auch

Andere mochten auch (17)

Moderni urheilumarkkinointi 30.03.2017, Sport & Business Forum, Oulu
Moderni urheilumarkkinointi 30.03.2017, Sport & Business Forum, OuluModerni urheilumarkkinointi 30.03.2017, Sport & Business Forum, Oulu
Moderni urheilumarkkinointi 30.03.2017, Sport & Business Forum, Oulu
 
HPC Top 5 Stories: March 29, 2017
HPC Top 5 Stories: March 29, 2017HPC Top 5 Stories: March 29, 2017
HPC Top 5 Stories: March 29, 2017
 
Maral Kalajian Keynote talk at The Influencer Convention at Sweden
Maral Kalajian Keynote talk at The Influencer Convention at SwedenMaral Kalajian Keynote talk at The Influencer Convention at Sweden
Maral Kalajian Keynote talk at The Influencer Convention at Sweden
 
君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?
 
Amazon AI (March 2017)
Amazon AI (March 2017)Amazon AI (March 2017)
Amazon AI (March 2017)
 
Scalability, Availability & Stability Patterns
Scalability, Availability & Stability PatternsScalability, Availability & Stability Patterns
Scalability, Availability & Stability Patterns
 
Hoofdzaken App
Hoofdzaken AppHoofdzaken App
Hoofdzaken App
 
The Marketer's Guide To Customer Interviews
The Marketer's Guide To Customer InterviewsThe Marketer's Guide To Customer Interviews
The Marketer's Guide To Customer Interviews
 
25 Discovery Call Questions
25 Discovery Call Questions25 Discovery Call Questions
25 Discovery Call Questions
 
Behind the Scenes: Launching HubSpot Tokyo
Behind the Scenes: Launching HubSpot TokyoBehind the Scenes: Launching HubSpot Tokyo
Behind the Scenes: Launching HubSpot Tokyo
 
HubSpot Diversity Data 2016
HubSpot Diversity Data 2016HubSpot Diversity Data 2016
HubSpot Diversity Data 2016
 
Why People Block Ads (And What It Means for Marketers and Advertisers) [New R...
Why People Block Ads (And What It Means for Marketers and Advertisers) [New R...Why People Block Ads (And What It Means for Marketers and Advertisers) [New R...
Why People Block Ads (And What It Means for Marketers and Advertisers) [New R...
 
What is Inbound Recruiting?
What is Inbound Recruiting?What is Inbound Recruiting?
What is Inbound Recruiting?
 
Add the Women Back: Wikipedia Edit-a-Thon
Add the Women Back: Wikipedia Edit-a-ThonAdd the Women Back: Wikipedia Edit-a-Thon
Add the Women Back: Wikipedia Edit-a-Thon
 
Its all about the domain honey
Its all about the domain honeyIts all about the domain honey
Its all about the domain honey
 
From pair programming to mob architecting
From pair programming to mob architecting From pair programming to mob architecting
From pair programming to mob architecting
 
今さら聞けないMicrosoft azure仮想マシン入門
今さら聞けないMicrosoft azure仮想マシン入門今さら聞けないMicrosoft azure仮想マシン入門
今さら聞けないMicrosoft azure仮想マシン入門
 

Ähnlich wie TDD mit JUnit und Mockito

Das funktionierte doch schon einmal! - JUnit Testing in XPages
Das funktionierte doch schon einmal! - JUnit Testing in XPagesDas funktionierte doch schon einmal! - JUnit Testing in XPages
Das funktionierte doch schon einmal! - JUnit Testing in XPages
Christian Güdemann
 

Ähnlich wie TDD mit JUnit und Mockito (20)

Advanced Continuous Integration
Advanced Continuous IntegrationAdvanced Continuous Integration
Advanced Continuous Integration
 
Continuous Integration / Deployment mit Jenkins CI
Continuous Integration / Deployment mit Jenkins CI Continuous Integration / Deployment mit Jenkins CI
Continuous Integration / Deployment mit Jenkins CI
 
Agiles Testen - Überblick
Agiles Testen - ÜberblickAgiles Testen - Überblick
Agiles Testen - Überblick
 
Kollaboration in Java Projekten - Anspruch und Realität
Kollaboration in Java Projekten - Anspruch und RealitätKollaboration in Java Projekten - Anspruch und Realität
Kollaboration in Java Projekten - Anspruch und Realität
 
Das funktionierte doch schon einmal! - JUnit Testing in XPages
Das funktionierte doch schon einmal! - JUnit Testing in XPagesDas funktionierte doch schon einmal! - JUnit Testing in XPages
Das funktionierte doch schon einmal! - JUnit Testing in XPages
 
UI Testautomation in der Praxis: Von Lokalisierung bis Nachhaltigkeit
UI Testautomation in der Praxis: Von Lokalisierung bis NachhaltigkeitUI Testautomation in der Praxis: Von Lokalisierung bis Nachhaltigkeit
UI Testautomation in der Praxis: Von Lokalisierung bis Nachhaltigkeit
 
Stay calm & keep shipping - iOS DevCon 2013
Stay calm & keep shipping - iOS DevCon 2013Stay calm & keep shipping - iOS DevCon 2013
Stay calm & keep shipping - iOS DevCon 2013
 
TDD mit ABAP Units
TDD mit ABAP UnitsTDD mit ABAP Units
TDD mit ABAP Units
 
Vortragsreihe Dortmund: Unified Development Environments
Vortragsreihe Dortmund: Unified Development EnvironmentsVortragsreihe Dortmund: Unified Development Environments
Vortragsreihe Dortmund: Unified Development Environments
 
Den PEP (Produktentwicklungsprozess) neu denken!
Den PEP (Produktentwicklungsprozess) neu denken!Den PEP (Produktentwicklungsprozess) neu denken!
Den PEP (Produktentwicklungsprozess) neu denken!
 
Softwaremonitoring mit prometheus
Softwaremonitoring mit prometheusSoftwaremonitoring mit prometheus
Softwaremonitoring mit prometheus
 
Automatisiertes webauftritt testen
Automatisiertes webauftritt testenAutomatisiertes webauftritt testen
Automatisiertes webauftritt testen
 
PHPUnit - Eine kurze Einführung
PHPUnit - Eine kurze EinführungPHPUnit - Eine kurze Einführung
PHPUnit - Eine kurze Einführung
 
Best Practices für TDD in JavaScript
Best Practices für TDD in JavaScriptBest Practices für TDD in JavaScript
Best Practices für TDD in JavaScript
 
DWX 2014 - Testmanagement mit Visual Studio 2013
DWX 2014 - Testmanagement mit Visual Studio 2013DWX 2014 - Testmanagement mit Visual Studio 2013
DWX 2014 - Testmanagement mit Visual Studio 2013
 
Software Entwicklung im Team
Software Entwicklung im TeamSoftware Entwicklung im Team
Software Entwicklung im Team
 
Testgetriebene Entwicklung
Testgetriebene EntwicklungTestgetriebene Entwicklung
Testgetriebene Entwicklung
 
Test-Alternativen
Test-AlternativenTest-Alternativen
Test-Alternativen
 
Innovation durch Scrum und Continuous Delivery
Innovation durch Scrum und Continuous DeliveryInnovation durch Scrum und Continuous Delivery
Innovation durch Scrum und Continuous Delivery
 
Vital und fit bis ins hohe Alter: Refactoring im Projekt
Vital und fit bis ins hohe Alter: Refactoring im ProjektVital und fit bis ins hohe Alter: Refactoring im Projekt
Vital und fit bis ins hohe Alter: Refactoring im Projekt
 

Mehr von Tobias Trelle

MongoDB - Riesige Datenmengen schemafrei verwalten
MongoDB - Riesige Datenmengen schemafrei verwaltenMongoDB - Riesige Datenmengen schemafrei verwalten
MongoDB - Riesige Datenmengen schemafrei verwalten
Tobias Trelle
 
Morphia, Spring Data & Co
Morphia, Spring Data & CoMorphia, Spring Data & Co
Morphia, Spring Data & Co
Tobias Trelle
 
BedCon 2013 - Java Persistenz-Frameworks für MongoDB
BedCon 2013 - Java Persistenz-Frameworks für MongoDBBedCon 2013 - Java Persistenz-Frameworks für MongoDB
BedCon 2013 - Java Persistenz-Frameworks für MongoDB
Tobias Trelle
 

Mehr von Tobias Trelle (13)

Einführung in NoSQL-Datenbanken
Einführung in NoSQL-DatenbankenEinführung in NoSQL-Datenbanken
Einführung in NoSQL-Datenbanken
 
MongoDB Einführung
MongoDB EinführungMongoDB Einführung
MongoDB Einführung
 
MongoDB - Riesige Datenmengen schemafrei verwalten
MongoDB - Riesige Datenmengen schemafrei verwaltenMongoDB - Riesige Datenmengen schemafrei verwalten
MongoDB - Riesige Datenmengen schemafrei verwalten
 
Test Automation for NoSQL Databases
Test Automation for NoSQL DatabasesTest Automation for NoSQL Databases
Test Automation for NoSQL Databases
 
Morphia, Spring Data & Co
Morphia, Spring Data & CoMorphia, Spring Data & Co
Morphia, Spring Data & Co
 
Spring Data, Jongo & Co.
Spring Data, Jongo & Co.Spring Data, Jongo & Co.
Spring Data, Jongo & Co.
 
Morphia, Spring Data & Co.
Morphia, Spring Data & Co.Morphia, Spring Data & Co.
Morphia, Spring Data & Co.
 
An introduction to MongoDB and Ruby
An introduction to MongoDB and RubyAn introduction to MongoDB and Ruby
An introduction to MongoDB and Ruby
 
BedCon 2013 - Java Persistenz-Frameworks für MongoDB
BedCon 2013 - Java Persistenz-Frameworks für MongoDBBedCon 2013 - Java Persistenz-Frameworks für MongoDB
BedCon 2013 - Java Persistenz-Frameworks für MongoDB
 
Java Persistence Frameworks for MongoDB
Java Persistence Frameworks for MongoDBJava Persistence Frameworks for MongoDB
Java Persistence Frameworks for MongoDB
 
OOP 2013: Praktische Einführung in MongoDB
OOP 2013: Praktische Einführung in MongoDBOOP 2013: Praktische Einführung in MongoDB
OOP 2013: Praktische Einführung in MongoDB
 
MongoDB Munich 2012: Spring Data MongoDB
MongoDB Munich 2012: Spring Data MongoDBMongoDB Munich 2012: Spring Data MongoDB
MongoDB Munich 2012: Spring Data MongoDB
 
MongoDB Live Hacking
MongoDB Live HackingMongoDB Live Hacking
MongoDB Live Hacking
 

TDD mit JUnit und Mockito