28
1

TDD mit JUnit und Mockito

Embed Size (px)

Citation preview

Page 1: TDD mit JUnit und Mockito

1

TDDmit JUnit & MockitoTobias Trelle, codecentric AG

@tobiastrelle

Page 2: TDD mit JUnit und Mockito

2

Tobias Trelle

Software Architekt @ codecentric AG

Twitter: @tobiastrelle

Slideshare: 

GitHub: 

http://de.slideshare.net/tobiastrelle/

https://github.com/ttrelle

Page 3: TDD mit JUnit und Mockito

2

3

AgendaTDD - Test Driven Development

JUnit

Mockito

Zusammen in Aktion!

Page 4: TDD mit JUnit und Mockito

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

Page 5: TDD mit JUnit und Mockito

5 . 1

TDDTest Driven Development

Page 6: TDD mit JUnit und Mockito

5 . 2

TDD Lifecycle

Page 7: TDD mit JUnit und Mockito

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

Page 8: TDD mit JUnit und Mockito

5 . 4

Vorteile von TDDSchnelles Feedback

Hohe Test-Abdeckung

Code ist testbar

Sicherheit bei Refactorings

Testfall als Spezifikation der Implementierung

Page 9: TDD mit JUnit und Mockito

Literatur

Page 10: TDD mit JUnit und Mockito

5 . 5

Page 11: TDD mit JUnit und Mockito

6 . 1

JUnithttp://junit.org

Page 12: TDD mit JUnit und Mockito

6 . 2

JUnitJava-Implementierung von xUnit

Test Framework

Defacto-Standard im Java-Bereich

Page 13: TDD mit JUnit und Mockito

6 . 3

Aktuelle stabile Version: 4.12

<dependency> <groupid>junit</groupid> <artifactid>junit</artifactid> <version>4.12</version> <scope>test</scope> </dependency>

Page 14: TDD mit JUnit und Mockito

6 . 4

JUnit FeaturesDefintion von Test Fixtures

Test-Ausführung

Assertions

Rules

Definition Test-Suiten

Integration in IDE / CI-Build

Page 15: TDD mit JUnit und Mockito

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")); } }

Page 16: TDD mit JUnit und Mockito

6 . 6

TDD Live Coding #1

Page 17: TDD mit JUnit und Mockito

7 . 1

Mockitohttp://site.mockito.org/

Page 18: TDD mit JUnit und Mockito

7 . 2

Tasty mocking framework for unit tests in Java 

to mock: etwas vortäuschen

Page 19: TDD mit JUnit und Mockito

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>

Page 20: TDD mit JUnit und Mockito

7 . 4

Mockito FeaturesMocking

Spying

Captors

Verifying

Page 21: TDD mit JUnit und Mockito

7 . 5

Mocken von Abhängigkeiten

Page 22: TDD mit JUnit und Mockito

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); }

}

Page 23: TDD mit JUnit und Mockito

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); } ... }

Page 24: TDD mit JUnit und Mockito

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")); }

Page 25: TDD mit JUnit und Mockito

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")); }

Page 26: TDD mit JUnit und Mockito

7 . 9

7 . 10

TDD Live Coding #2

Page 27: TDD mit JUnit und Mockito

7 . 11

Grenzen von MockitoFinale Klassen / Methoden

Statische Methoden

Abhilfe: PowerMock für Mockito

Page 28: TDD mit JUnit und Mockito

TDD mit JUnit & Mockito - Tobias Trelle, codecentric AG 8

Danke für Ihre AufmerksamkeitTobias Trelle, codecentric AG

@tobiastrelle