presentation & tools (eclipse, maven, mockito, spring...

66
Junit Presentation & Tools (Eclipse, Maven, Mockito, Spring) [email protected] This document: http://arnaud-nauwynck.github.io/lessons/CoursIUT-JUnit.pdf

Upload: vuongthuy

Post on 13-Jun-2018

221 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

JunitPresentation & Tools

(Eclipse, Maven, Mockito, Spring)

[email protected]

This document: http://arnaud-nauwynck.github.io/lessons/CoursIUT-JUnit.pdf

Page 2: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

What is Junit ?

Page 3: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

Wikipedia JUnit

Page 4: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

Junit birth

Mid-90'sKent Beck developed xUnit test tool for Smalltalk

1997Beck and Gamma (authors of design patterns “Gof”)developed JUnit … on a flight from Zurich to Washington, D.C.

Written in few hours => The code is small, simple

Page 5: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

How Small is Junit ?

$ git clone https://github.com/junit-team/junit4.git$ cd junit4

$ find src/main/java -name \*.java | wc -l204

$ find src/main/java -name \*.java | xargs cat | wc -l 18136

$ … | grep -v '^\s*\*' | grep -v '^\s*/\*' | wc -l11958

~200 java source files

~12 000 lines of code+ 6 000 lines of javadoc

Page 6: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

Junit History : 3 < 4 < 5

Junit5 in alpha versionJunit 4

supports Java 5 Annotations

@Test public void foo() {}

No extends TestCase

Junit 3

class MyTest extends TestCase {

public void testFoo() { Assert.assertEquals(...); }

}

The code has not changed for years (annotation with Java 5)

2005java5

2002Junit 3.8.2

2006Junit 4

20161997Junit

2015java8

Page 7: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

Small but Powerfull

“Never in the field of software development was so much owed by so many to so few lines of code.”

Martin Fowler

Page 8: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

De Facto Standard

Used by ~30% majorGithub projects

Integrated in ALL Tools

Page 9: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

Junit impacts .. eXtreme Programing, TDD, BDD,

Refactoring, Clean Code, Mock, IOC Injection ...

1997

JUnit

http://wiki.c2.com/?TenYearsOfTestDrivenDevelopment

2000

TDD

2001

Continuous Integration, Maven

Mock Objects - library

2002

Junit in Eclipse

Springframework

BDD Behavor Driven

20051999

Refactoring

Junit.org

Extreme Programming

http://www.martinfowler.com/bliki/Xunit.html

Page 10: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

xUnit

Junit … J=Java

but not only Java …

xUnit = ports in all langages

Standard in ALL langages

Page 11: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

http://junit.org/junit4/

Page 12: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

https://github.com/junit-team/junit4

Page 13: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

http://junit.org/junit5/

Page 14: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

https://github.com/junit-team/junit5

Page 15: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

Getting Started : New ProjectEclipse + Maven

Page 16: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

New Maven Project

Page 17: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

Blank Junit Project

source in src/main/java

tests in src/test/java

Page 18: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

JUnit = Unitary Class Test

1 class => 1 Test Class1 method => 1 Test method

SUT = System Under Test

Page 19: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

Example of System Under Test

This method is supposed to eval any JavaScript from JRE Does it work ??

Page 20: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

Let's Test It – Start Small, Trivial

At least, it should not break(but it could be anything else than JavaScript)

It looks UglyIt looks real JavaScript

Page 21: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

Junit in Eclipse

Page 22: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

Let's Run It

Page 23: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

Junit Result View

Page 24: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

Launch Shortcuts in Eclipse

F11 = execute(On test, on main, on launch target..)

Shift+Alt+D T (=debug test)

CTRL + R (see next: MoreUnit)

Page 25: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

Junit Results – OK / Assert / Failure

Page 26: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

Run All package Tests

Page 27: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

Junit in Maven

Page 28: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

Junit dependency in Maven pom.xml

“jar” project => built-in supports for compile + compile-test + test +jar ...

Junit.jar test compile dependency

Page 29: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

Junit = built-in in Maven

$ mvn install

# test only:$ mvn test

Page 30: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

Skip Tests in Maven

# all but test:$ mvn install -DskipTests

In ~/.m2/ settings.xml

Page 31: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

Test Phase in Maven

Phases:- resources- compile- compile -test- test

- jar-install

Page 32: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

Junit error => Build Failure

… (truncated )

Page 33: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

MoreUnit Eclipse Plugin

Page 34: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

Junit Naming Conventions

A class “App” in package “a.b.c”in src/main/java

“AppTest” in same package “a.b.c”in src/test/java

Page 35: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

Eclipse .. Switching from src to test

CTRL + Jsrc/main src/test

CTRL + U(first to generate)

Page 36: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

Install Eclipse MoreUnit

Page 37: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

Eclipse MoreUnit plugin

CTRL + J

Page 38: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

MoreUnit – Missing Tests Methods

CTRL + U

Page 39: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

InfiniTest Eclipse Plugin

Page 40: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

InfiniTest Installation

Page 41: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

InfiniTest Status Bar

InfiniTest Status Bar

Page 42: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

Save => InfiniTest runs TestsTest Fails = Compile Error

Page 43: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

Slow Test => infinitest.filters

Page 44: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

EclEma Eclipse Plugin

Page 45: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

EclEmma Installation

Page 46: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

Ecl Emma = Code Coverage

Run with Coverage

Shift+Alt+E T

Page 47: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

Code Coverage %

Page 48: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

Testability Principles

Page 49: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

How to Unit Test a System with Dependencies ?

Page 50: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

“Unit” Test = Isolated Unitary Test

System Under Test

Dependency1

Dependency2

Test that onlyNot that ...

Page 51: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

… Difficult to Test …use @Override if not final

Page 52: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

Use MockObjects

System Under Test

MockDependency1

Dependency2

Test that only

Replace by Mock for Testing...

Dependency1

MockDependency2

Page 53: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

Testability PrinciplesIOC = “Inversion Of Control” / DI = Dependency Injection

No hard-coded dependenciesNo “new”

No “Static”No “final”

No explicit implementation dependencies

Hollywood principle: “don't call me, I will call you”Inversion of Control

I need your interface only

Page 54: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

Use Dependency Injectionby Constructor

Page 55: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

Or Field Injection by Annotation

Page 56: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

Mockito Library

Page 57: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

@Mock + @InjectMocks

The SUT is injected its dependencies with @InjectMocks

Each Mocked dependency is createdwith @Mock

… equivalent to “Mockito.mock(MyXX.class)”

Page 58: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

@RunWith(MockitoJUnitRunner.class)

Where the magic starts … (from Junit runner)

Otherwise ..Unless interpreted, annotation are just as javadoc

Junit understand to start a Mockito Test

Page 59: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

Mockito Test Example

Page 60: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

Springframework Test Library

Page 61: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

Spring = THE IOC Library for Java

● DE FACTO Standard for IOC in Java● Others impementations:

– Guice, Plexus, EJB (seriously?), ...

Page 62: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

Upgrade code to Springframework

1/ Add springboot-parent + spring-* pom.xml

2/ Add @Component to managed bean classes

3/ Add @Configuration (with @ComponentScan)

Page 63: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

@Inject SUT (with real Dependencies...)

There is NO Mock here !!This is an Integration Test, not a Unit test

The SUT is injected its dependencies with @Inject

Page 64: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

@RunWith(SpringJUnit4Runner.class)

Where the magic starts … (from Junit runner)

Otherwise ..Unless interpreted, annotation are just as javadoc… like Mockito

Junit understand to start a Spring Test

Springframework understand its configuration

Page 65: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

Run Test with Spring

Page 66: Presentation & Tools (Eclipse, Maven, Mockito, Spring ...arnaud-nauwynck.github.io/docs/CoursIUT-JUnit.pdf · a Mockito Test. Mockito Test Example. Springframework Test Library. Spring

Conclusion

● Junit ecosystem is amazing – Junit, Maven, Eclipse, Mockito, SpringFramework

all works together

– TDD - For better code

● Questions ?– [email protected]

● This document:http://arnaud-nauwynck.github.io/lessons/CoursIUT-JUnit.pdf