©2016 IKERLAN. All rights reserved©2016 IKERLAN. All rights reserved
Ikerlan – Java 8
Ángel Conde– [DevOps & Data Engineer]
2016/4/6
©2016 IKERLAN. All rights reserved 2
Outline
1. Maven – Solving the Dependency Hell
2. Java 8 – What's new
3. Logging – Understanding the JVM logging system
4. Useful libraries – do not reinvent the wheel
5. Testing – Mocks Everywhere
©2016 IKERLAN. All rights reserved 3
Automatize your builds
Tasks called phases.
Dependency management via repositories.
XML configuration, quite verbose.
Plugin support.
1. validate
2. generate-sources
3. process-sources
4. generate-resources
5. process-resources
6. compile
mvn compile
©2016 IKERLAN. All rights reserved 4
<project xmlns=http://maven.apache.org/POM/4.0.0 …. ">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>es.ikerlan.ulma</groupId>
<artifactId>ulma-supervisor</artifactId>
<version>1.0</version>
</parent>
<artifactId>compactor</artifactId>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<name>compactor</name>
<repositories> </repositories>
<dependencies> </dependencies>
<build>
<plugins> </plugins>
</build>
</project>
– A “pom” to rule them all
©2016 IKERLAN. All rights reserved 5
– Dependencies
<dependencies>
<dependency>
<groupId>group-a</groupId>
<artifactId>artifact-a</artifactId>
<version>1.0</version>
<exclusions>
<exclusion>
<groupId>group-c</groupId>
<artifactId>excluded-artifact</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>group-a</groupId>
<artifactId>artifact-b</artifactId>
<version>1.0</version>
<type>bar</type>
<scope>runtime</scope>
</dependency>
</dependencies>
Transitive dependency support & Scope Limit.
©2016 IKERLAN. All rights reserved 6
– Useful plugins
1. maven-shade-plugin: Uber Jar generation.
2. findbugs-maven-plugin: static code analysis.
3. maven-surefire-plugin: automates JUnit tests.
4. maven-enforcer-plugin: enforces configuration.
5. docker-maven-plugin: generates Docker images.
6. exec-maven-plugin: provides execution capabilities.
©2016 IKERLAN. All rights reserved 7
– The Future?
Google’s Maven “successor”
Groovy-based DSL instead of XML.
DAG in order to solve tasks ordering.
Dependency solver.
Multi-language support.
©2016 IKERLAN. All rights reserved 8
Outline
1. Maven – Solving the Dependency Hell
2. Java 8 – What's new
3. Logging – Understanding the JVM logging system
4. Useful libraries – do not reinvent the wheel
5. Testing – Mocks Everywhere
©2016 IKERLAN. All rights reserved 9
Java 8 – Default Methods
Allows developer to add new methods to old interfaces.
Used to add Lambdas and Streams support to the JDK8.
public interface oldInterface {
public void existingMethod();
default public void newDefaultMethod() {
System.out.println("New default method" " is added
in interface");
}
}
©2016 IKERLAN. All rights reserved 10
Java 8 – Functional Interfaces
Interfaces with only one method.
Used for providing lambda support to the JDK.
@FunctionalInterface
public interface Predicate<T>{
boolean test(T t);
}
public static <T> List<T> filter(List<T> list, Predicate<T> p) {
List<T> results = new ArrayList<>();
for(T s: list){
if(p.test(s)){
results.add(s);
}
}
return results;
}
©2016 IKERLAN. All rights reserved 11
Java 8 – Method References
Class::Method  meaning “use this method as a value”
File[] hiddenFiles = new File(".").listFiles(File::isHidden);
File[] hiddenFiles = new File(".").listFiles(new FileFilter()
{
public boolean accept(File file) {
return file.isHidden();
}
});
Vanilla Java
Java 8
©2016 IKERLAN. All rights reserved 12
Java 8 – Anonymous Functions (Lambdas)
public static boolean isGreenApple(Apple apple) {
return "green".equals(apple.getColor());
}
Java 7
filterApples(inventory, (Apple a) -> a.getWeight() > 150 );
Java 8
1.(int x, int y) -> x + y
2.(x, y) -> x - y
3.() -> 42
4.(String s) -> System.out.println(s)
5.x -> 2 * x
Introduce the idea of functions into the language.
Kind of anonymous method with compact syntax.
©2016 IKERLAN. All rights reserved 13
Java 8 – Streams
Lazy Immutable evaluated collections.
Partially evaluated —elements remain to be generated.
Exhausted — when its elements are used up.
An array, a collection, a generator function, or an IO channel.
Two types of operations: intermediate and terminal.
A partially evaluated stream may have infinitely elements.
IntStream.iterate(0, i -> i + 2)
.limit(100)
.forEach(System.out::println);
Stream.generate(Math::random)
.limit(5)
.forEach(System.out::println);
©2016 IKERLAN. All rights reserved 14
Java 8 – Streams (II)
©2016 IKERLAN. All rights reserved 15
Java 8 – Streams (III)
List<String> title = Arrays.asList("Java8", “Rules");
Stream<String> s = title.stream();
s.forEach(System.out::println);
s.forEach(System.out::println);
s.stream()
.map(w -> w.split(""))
.flatMap(Arrays::stream)
.distinct()
.collect(Collectors.toList());
s.stream()
.map(word -> word.split(""))
.map(Arrays::stream)
.distinct()
.collect(toList());
List<Integer> result = numbers.stream()
.peek(x -> System.out.println("from stream: " + x))
.map(x -> x + 17)
.collect(toList());
ERROR!! Stream already closed
ERROR!! Nested Stream….
©2016 IKERLAN. All rights reserved 16
Java 8 – Streams (IV)
List<String> names = menu.stream()
.filter(d -> d.getCalories() > 300)
.map(Dish::getName)
.limit(3)
.collect(toList());
String traderStr = transactions.stream()
.map(transaction -> transaction.getTrader().getName())
.distinct()
.sorted()
.reduce("", (n1, n2) -> n1 + n2);
String traderStr = transactions.stream()
.map(transaction -> transaction.getTrader().getName())
.distinct()
.sorted()
.collect(joining());
The second is faster because it avoids String duplication with StringBuilder
©2016 IKERLAN. All rights reserved 17
Java 8 – Streams (V)
String traderStr = transactions.stream()
.map(transaction -> transaction.getTrader().getName())
.distinct()
.sorted()
.collect(joining());
Map<Dish.Type, List<Dish>>
dishesByType = menu.stream()
collect(groupingBy(Dish::getType));
The Collector Interface
Implement various useful reduction operations.
©2016 IKERLAN. All rights reserved 18
Java 8 – Streams (VI)
Immutable parallelism: fork / join pools
©2016 IKERLAN. All rights reserved 19
Java 8 – Streams (VII)
public static long rangedSum(long n) {
return LongStream.rangeClosed(1, n)
.parallel()
.reduce(0L, Long::sum);
}
public static long parallelSum(long n) {
return Stream.iterate(1L, i -> i + 1)
.limit(n)
.parallel()
.reduce(0L, Long::sum);
}
Avoid this, very slow!! (iterate is not parallel friendly)
Very fast because LongStream provide longs NOT Longs
©2016 IKERLAN. All rights reserved 20
Java 8 – Streams (VII)
public static long sideEffectSum(long n) {
Accumulator accumulator = new Accumulator();
LongStream.rangeClosed(1,n).
forEach(accumulator::add);
return accumulator.total;
}
public class Accumulator {
public long total = 0;
public void add(long value) {
total += value; }
}
stream.parallel()
.filter(...)
.sequential()
.map(...)
.parallel()
.reduce();
Fine-Grained control?
AVOID MUTABLE STRUCTURES!!!!
©2016 IKERLAN. All rights reserved 21
Java 8 – More Features
Data & Time API (based on Joda-Time library).
CompletableFuture, futures the functional way.
Optionals for avoiding null checking.
LocalDate today = LocalDate.now();
LocalDate nextWeek = today.plus(1, ChronoUnit.WEEKS);
public void renderPage(CharSequence source) {
List<ImageInfo> info = scanForImageInfo(source);
info.forEach(imageInfo -> CompletableFuture
.supplyAsync(imageInfo::downloadImage)
.thenAccept(this::renderImage));
renderText(source); }
String name = computer.flatMap(Computer::getSoundcard)
.flatMap(Soundcard::getUSB) .map(USB::getVersion)
.orElse("UNKNOWN");
©2016 IKERLAN. All rights reserved 22
Outline
1. Maven – Solving the Dependency Hell
2. Java 8 – What's new
3. Logging – Understanding the JVM logging system
4. Useful libraries – do not reinvent the wheel
5. Testing – Mocks Everywhere
©2016 IKERLAN. All rights reserved 23
Logging Systems
In Java world different implementations.
1. Interface.
2. Underlying implementation.
3. Configuration.
private final Logger log = LoggerFactory.getLogger(LogExample.class);
public static void main(String... args) {
log.error("Something's wrong here");
}
static
©2016 IKERLAN. All rights reserved 24
Slf4j
©2016 IKERLAN. All rights reserved 25
Slf4j
©2016 IKERLAN. All rights reserved 26
Slf4j with Logback
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT“ class="c...core.ConsoleAppender">
<encoder class="c...encoder.PatternLayoutEncoder">
<Pattern>
%d{HH:mm:ss} [%thread] %-5level %logger{36} %msg%n
</Pattern>
</encoder>
</appender>
<logger name="es.ikerlan.ulma" level="warn"/>
<logger name="org.apache.hadoop" level="error"/>
<logger name="parquet.hadoop" level="error"/>
<root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration>
Logback.xml
©2016 IKERLAN. All rights reserved 27
Outline
1. Maven – Solving the Dependency Hell
2. Java 8 – What's new
3. Logging – Understanding the JVM logging system
4. Useful libraries – do not reinvent the wheel
5. Testing – Mocks Everywhere
©2016 IKERLAN. All rights reserved 28
Useful Libraries – lombok
https://projectlombok.org/ – useful decorators.
- @Data: adds setters/getters, constructor.
- @Slf4j: adds logging via SLF4J.
@Data
public class DataExample {
private final String name;
private double score;
}
lombok
@Data
public class DataExample {
private final String name;
private double score;
public String getName(){
return name;
}
public double getScore(){
return score;
}
……
}
vanilla Java
©2016 IKERLAN. All rights reserved 29
Useful Libraries
http://www.jcabi.com/ – more decorators and utilities (Amazon,
Json, XML….)
https://github.com/google/guava – Google Java core libraries, from
caches, parsers, optionals, collections, etc.
https://commons.apache.org/ – apache hosted libraries.
©2016 IKERLAN. All rights reserved 30
Outline
1. Maven – Solving the Dependency Hell
2. Java 8 – What's new
3. Logging – Understanding the JVM logging system
4. Useful libraries – do not reinvent the wheel
5. Testing – Mocks Everywhere
©2016 IKERLAN. All rights reserved 31
– Testing
The facto standard unit testing library for Java.
Best tool for Test Driven development.
@Test : methods to be executed on testing
@Before: executed before each test
@After: executed before each test
@BeforeClass: runs once before the test fixture.
@AfterClass: runs once before the entire test fixture.
©2016 IKERLAN. All rights reserved 32
– Testing
@Test
public void multiplicationOfZeroIntegersShouldReturnZero()
{
// MyClass is tested
MyClass tester = new MyClass();
// assert statements
assertEquals("10 x 0 must be 0", 0, tester.multiply(10, 0));
assertEquals("0 x 10 must be 0", 0, tester.multiply(0, 10));
assertEquals("0 x 0 must be 0", 0, tester.multiply(0, 0));
}
An example:
©2016 IKERLAN. All rights reserved 33
– Mocks everywhere
mock()/@Mock: create mock from an object.
when()/given() : to specify how a mock should behave
spy()/@Spy: partial mocking, methods are invoked but still can be verified and stubbed
@InjectMocks: automatically inject mocks/spies fields annotated with @Spy or @Mock
verify(): to check methods were called with given arguments
Mock Object library for testing.
©2016 IKERLAN. All rights reserved 34
– Mocks everywhere (II)
@Spy
private LocationService locationService;
@Test
public final void spyTest() {
//mock the object
Location loc = new Location();
//we mock the locationService.getLocation method from the real
object using mockito
doReturn(loc).when(locationService).getLocation("test");
Location found = locationService.getLocation("test");
assertEquals(loc, found);
}
An example with @Spy:
©2016 IKERLAN. All rights reserved
IKERLAN Polo Garaia
C/ Goiru , 9
20500 Arrasate-Mondragón
Tel.: 943 71 02 12
Fax: 943 79 69 44
IKERLAN Unidad de energía
Parque Tecnológico de Álava,
C/ Juan de la Cierva, 1
01510 Miñano
Tel.: 945 29 70 32
Fax: 943 79 69 44
www.ikerlan.es
ORONA IDeO - Innovation city
Pol. Industrial Galarreta,
Parcela 10.5, Edificio A3
20120 Hernani
Tel.: 945 29 70 32
Fax: 943 79 69 44
IKERLAN
Pº. J. Mª. Arizmendiarrieta, 2
20500 Arrasate-Mondragón
Tel.: 943 71 24 00
Fax: 943 79 69 44
Questions?
Email: aconde@ikerlan.es
Thanks for your attention:

Modern Java Development

  • 1.
    ©2016 IKERLAN. Allrights reserved©2016 IKERLAN. All rights reserved Ikerlan – Java 8 Ángel Conde– [DevOps & Data Engineer] 2016/4/6
  • 2.
    ©2016 IKERLAN. Allrights reserved 2 Outline 1. Maven – Solving the Dependency Hell 2. Java 8 – What's new 3. Logging – Understanding the JVM logging system 4. Useful libraries – do not reinvent the wheel 5. Testing – Mocks Everywhere
  • 3.
    ©2016 IKERLAN. Allrights reserved 3 Automatize your builds Tasks called phases. Dependency management via repositories. XML configuration, quite verbose. Plugin support. 1. validate 2. generate-sources 3. process-sources 4. generate-resources 5. process-resources 6. compile mvn compile
  • 4.
    ©2016 IKERLAN. Allrights reserved 4 <project xmlns=http://maven.apache.org/POM/4.0.0 …. "> <modelVersion>4.0.0</modelVersion> <parent> <groupId>es.ikerlan.ulma</groupId> <artifactId>ulma-supervisor</artifactId> <version>1.0</version> </parent> <artifactId>compactor</artifactId> <packaging>jar</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <name>compactor</name> <repositories> </repositories> <dependencies> </dependencies> <build> <plugins> </plugins> </build> </project> – A “pom” to rule them all
  • 5.
    ©2016 IKERLAN. Allrights reserved 5 – Dependencies <dependencies> <dependency> <groupId>group-a</groupId> <artifactId>artifact-a</artifactId> <version>1.0</version> <exclusions> <exclusion> <groupId>group-c</groupId> <artifactId>excluded-artifact</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>group-a</groupId> <artifactId>artifact-b</artifactId> <version>1.0</version> <type>bar</type> <scope>runtime</scope> </dependency> </dependencies> Transitive dependency support & Scope Limit.
  • 6.
    ©2016 IKERLAN. Allrights reserved 6 – Useful plugins 1. maven-shade-plugin: Uber Jar generation. 2. findbugs-maven-plugin: static code analysis. 3. maven-surefire-plugin: automates JUnit tests. 4. maven-enforcer-plugin: enforces configuration. 5. docker-maven-plugin: generates Docker images. 6. exec-maven-plugin: provides execution capabilities.
  • 7.
    ©2016 IKERLAN. Allrights reserved 7 – The Future? Google’s Maven “successor” Groovy-based DSL instead of XML. DAG in order to solve tasks ordering. Dependency solver. Multi-language support.
  • 8.
    ©2016 IKERLAN. Allrights reserved 8 Outline 1. Maven – Solving the Dependency Hell 2. Java 8 – What's new 3. Logging – Understanding the JVM logging system 4. Useful libraries – do not reinvent the wheel 5. Testing – Mocks Everywhere
  • 9.
    ©2016 IKERLAN. Allrights reserved 9 Java 8 – Default Methods Allows developer to add new methods to old interfaces. Used to add Lambdas and Streams support to the JDK8. public interface oldInterface { public void existingMethod(); default public void newDefaultMethod() { System.out.println("New default method" " is added in interface"); } }
  • 10.
    ©2016 IKERLAN. Allrights reserved 10 Java 8 – Functional Interfaces Interfaces with only one method. Used for providing lambda support to the JDK. @FunctionalInterface public interface Predicate<T>{ boolean test(T t); } public static <T> List<T> filter(List<T> list, Predicate<T> p) { List<T> results = new ArrayList<>(); for(T s: list){ if(p.test(s)){ results.add(s); } } return results; }
  • 11.
    ©2016 IKERLAN. Allrights reserved 11 Java 8 – Method References Class::Method  meaning “use this method as a value” File[] hiddenFiles = new File(".").listFiles(File::isHidden); File[] hiddenFiles = new File(".").listFiles(new FileFilter() { public boolean accept(File file) { return file.isHidden(); } }); Vanilla Java Java 8
  • 12.
    ©2016 IKERLAN. Allrights reserved 12 Java 8 – Anonymous Functions (Lambdas) public static boolean isGreenApple(Apple apple) { return "green".equals(apple.getColor()); } Java 7 filterApples(inventory, (Apple a) -> a.getWeight() > 150 ); Java 8 1.(int x, int y) -> x + y 2.(x, y) -> x - y 3.() -> 42 4.(String s) -> System.out.println(s) 5.x -> 2 * x Introduce the idea of functions into the language. Kind of anonymous method with compact syntax.
  • 13.
    ©2016 IKERLAN. Allrights reserved 13 Java 8 – Streams Lazy Immutable evaluated collections. Partially evaluated —elements remain to be generated. Exhausted — when its elements are used up. An array, a collection, a generator function, or an IO channel. Two types of operations: intermediate and terminal. A partially evaluated stream may have infinitely elements. IntStream.iterate(0, i -> i + 2) .limit(100) .forEach(System.out::println); Stream.generate(Math::random) .limit(5) .forEach(System.out::println);
  • 14.
    ©2016 IKERLAN. Allrights reserved 14 Java 8 – Streams (II)
  • 15.
    ©2016 IKERLAN. Allrights reserved 15 Java 8 – Streams (III) List<String> title = Arrays.asList("Java8", “Rules"); Stream<String> s = title.stream(); s.forEach(System.out::println); s.forEach(System.out::println); s.stream() .map(w -> w.split("")) .flatMap(Arrays::stream) .distinct() .collect(Collectors.toList()); s.stream() .map(word -> word.split("")) .map(Arrays::stream) .distinct() .collect(toList()); List<Integer> result = numbers.stream() .peek(x -> System.out.println("from stream: " + x)) .map(x -> x + 17) .collect(toList()); ERROR!! Stream already closed ERROR!! Nested Stream….
  • 16.
    ©2016 IKERLAN. Allrights reserved 16 Java 8 – Streams (IV) List<String> names = menu.stream() .filter(d -> d.getCalories() > 300) .map(Dish::getName) .limit(3) .collect(toList()); String traderStr = transactions.stream() .map(transaction -> transaction.getTrader().getName()) .distinct() .sorted() .reduce("", (n1, n2) -> n1 + n2); String traderStr = transactions.stream() .map(transaction -> transaction.getTrader().getName()) .distinct() .sorted() .collect(joining()); The second is faster because it avoids String duplication with StringBuilder
  • 17.
    ©2016 IKERLAN. Allrights reserved 17 Java 8 – Streams (V) String traderStr = transactions.stream() .map(transaction -> transaction.getTrader().getName()) .distinct() .sorted() .collect(joining()); Map<Dish.Type, List<Dish>> dishesByType = menu.stream() collect(groupingBy(Dish::getType)); The Collector Interface Implement various useful reduction operations.
  • 18.
    ©2016 IKERLAN. Allrights reserved 18 Java 8 – Streams (VI) Immutable parallelism: fork / join pools
  • 19.
    ©2016 IKERLAN. Allrights reserved 19 Java 8 – Streams (VII) public static long rangedSum(long n) { return LongStream.rangeClosed(1, n) .parallel() .reduce(0L, Long::sum); } public static long parallelSum(long n) { return Stream.iterate(1L, i -> i + 1) .limit(n) .parallel() .reduce(0L, Long::sum); } Avoid this, very slow!! (iterate is not parallel friendly) Very fast because LongStream provide longs NOT Longs
  • 20.
    ©2016 IKERLAN. Allrights reserved 20 Java 8 – Streams (VII) public static long sideEffectSum(long n) { Accumulator accumulator = new Accumulator(); LongStream.rangeClosed(1,n). forEach(accumulator::add); return accumulator.total; } public class Accumulator { public long total = 0; public void add(long value) { total += value; } } stream.parallel() .filter(...) .sequential() .map(...) .parallel() .reduce(); Fine-Grained control? AVOID MUTABLE STRUCTURES!!!!
  • 21.
    ©2016 IKERLAN. Allrights reserved 21 Java 8 – More Features Data & Time API (based on Joda-Time library). CompletableFuture, futures the functional way. Optionals for avoiding null checking. LocalDate today = LocalDate.now(); LocalDate nextWeek = today.plus(1, ChronoUnit.WEEKS); public void renderPage(CharSequence source) { List<ImageInfo> info = scanForImageInfo(source); info.forEach(imageInfo -> CompletableFuture .supplyAsync(imageInfo::downloadImage) .thenAccept(this::renderImage)); renderText(source); } String name = computer.flatMap(Computer::getSoundcard) .flatMap(Soundcard::getUSB) .map(USB::getVersion) .orElse("UNKNOWN");
  • 22.
    ©2016 IKERLAN. Allrights reserved 22 Outline 1. Maven – Solving the Dependency Hell 2. Java 8 – What's new 3. Logging – Understanding the JVM logging system 4. Useful libraries – do not reinvent the wheel 5. Testing – Mocks Everywhere
  • 23.
    ©2016 IKERLAN. Allrights reserved 23 Logging Systems In Java world different implementations. 1. Interface. 2. Underlying implementation. 3. Configuration. private final Logger log = LoggerFactory.getLogger(LogExample.class); public static void main(String... args) { log.error("Something's wrong here"); } static
  • 24.
    ©2016 IKERLAN. Allrights reserved 24 Slf4j
  • 25.
    ©2016 IKERLAN. Allrights reserved 25 Slf4j
  • 26.
    ©2016 IKERLAN. Allrights reserved 26 Slf4j with Logback <?xml version="1.0" encoding="UTF-8"?> <configuration> <appender name="STDOUT“ class="c...core.ConsoleAppender"> <encoder class="c...encoder.PatternLayoutEncoder"> <Pattern> %d{HH:mm:ss} [%thread] %-5level %logger{36} %msg%n </Pattern> </encoder> </appender> <logger name="es.ikerlan.ulma" level="warn"/> <logger name="org.apache.hadoop" level="error"/> <logger name="parquet.hadoop" level="error"/> <root level="debug"> <appender-ref ref="STDOUT" /> </root> </configuration> Logback.xml
  • 27.
    ©2016 IKERLAN. Allrights reserved 27 Outline 1. Maven – Solving the Dependency Hell 2. Java 8 – What's new 3. Logging – Understanding the JVM logging system 4. Useful libraries – do not reinvent the wheel 5. Testing – Mocks Everywhere
  • 28.
    ©2016 IKERLAN. Allrights reserved 28 Useful Libraries – lombok https://projectlombok.org/ – useful decorators. - @Data: adds setters/getters, constructor. - @Slf4j: adds logging via SLF4J. @Data public class DataExample { private final String name; private double score; } lombok @Data public class DataExample { private final String name; private double score; public String getName(){ return name; } public double getScore(){ return score; } …… } vanilla Java
  • 29.
    ©2016 IKERLAN. Allrights reserved 29 Useful Libraries http://www.jcabi.com/ – more decorators and utilities (Amazon, Json, XML….) https://github.com/google/guava – Google Java core libraries, from caches, parsers, optionals, collections, etc. https://commons.apache.org/ – apache hosted libraries.
  • 30.
    ©2016 IKERLAN. Allrights reserved 30 Outline 1. Maven – Solving the Dependency Hell 2. Java 8 – What's new 3. Logging – Understanding the JVM logging system 4. Useful libraries – do not reinvent the wheel 5. Testing – Mocks Everywhere
  • 31.
    ©2016 IKERLAN. Allrights reserved 31 – Testing The facto standard unit testing library for Java. Best tool for Test Driven development. @Test : methods to be executed on testing @Before: executed before each test @After: executed before each test @BeforeClass: runs once before the test fixture. @AfterClass: runs once before the entire test fixture.
  • 32.
    ©2016 IKERLAN. Allrights reserved 32 – Testing @Test public void multiplicationOfZeroIntegersShouldReturnZero() { // MyClass is tested MyClass tester = new MyClass(); // assert statements assertEquals("10 x 0 must be 0", 0, tester.multiply(10, 0)); assertEquals("0 x 10 must be 0", 0, tester.multiply(0, 10)); assertEquals("0 x 0 must be 0", 0, tester.multiply(0, 0)); } An example:
  • 33.
    ©2016 IKERLAN. Allrights reserved 33 – Mocks everywhere mock()/@Mock: create mock from an object. when()/given() : to specify how a mock should behave spy()/@Spy: partial mocking, methods are invoked but still can be verified and stubbed @InjectMocks: automatically inject mocks/spies fields annotated with @Spy or @Mock verify(): to check methods were called with given arguments Mock Object library for testing.
  • 34.
    ©2016 IKERLAN. Allrights reserved 34 – Mocks everywhere (II) @Spy private LocationService locationService; @Test public final void spyTest() { //mock the object Location loc = new Location(); //we mock the locationService.getLocation method from the real object using mockito doReturn(loc).when(locationService).getLocation("test"); Location found = locationService.getLocation("test"); assertEquals(loc, found); } An example with @Spy:
  • 35.
    ©2016 IKERLAN. Allrights reserved IKERLAN Polo Garaia C/ Goiru , 9 20500 Arrasate-Mondragón Tel.: 943 71 02 12 Fax: 943 79 69 44 IKERLAN Unidad de energía Parque Tecnológico de Álava, C/ Juan de la Cierva, 1 01510 Miñano Tel.: 945 29 70 32 Fax: 943 79 69 44 www.ikerlan.es ORONA IDeO - Innovation city Pol. Industrial Galarreta, Parcela 10.5, Edificio A3 20120 Hernani Tel.: 945 29 70 32 Fax: 943 79 69 44 IKERLAN Pº. J. Mª. Arizmendiarrieta, 2 20500 Arrasate-Mondragón Tel.: 943 71 24 00 Fax: 943 79 69 44 Questions? Email: aconde@ikerlan.es Thanks for your attention: