Top Banner
New Opportunities for Testing on the JVM @sam_brannen JUnit
65

JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

Apr 21, 2018

Download

Documents

doanngoc
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

New Opportunities for Testing on the JVM

@sam_brannen

JUnit

Page 2: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

Sam Brannen •  Spring and Java Consultant

•  Trainer, Coach, …

•  Hardcore developer at heart

•  Java Developer for about 20 years

•  Spring Framework Core Committer since 2007

•  JUnit 5 Core Committer since October 2015

Page 3: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

Experts in Spring and Enterprise Java

Areas of expertise•  Spring *

•  JUnit 5

•  Java EE

•  Software Architecture

•  Code Reviews

Where you find us •  Zurich, Switzerland • @swiftmind

•  http://www.swiftmind.com

Page 4: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

Agenda •  Impetus for Change

•  JUnit 5

•  Spring 5

•  Q & A

Page 5: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

Show of hands …

Page 6: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

Why a new version of JUnit?

Page 7: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

Impetus for Change •  JUnit 4.0 was released a decade ago

•  a lot has changed since then…•  testing needs have matured

•  expectations have grown

•  Modularity à big ball of mud (i.e., only THE junit.jar)

•  Test discovery and execution à tightly coupled

•  Extensibility à lot of room for improvement

•  Let’s not forget Java 8 and Java 9

Page 8: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

JUnit 4 Runner API •  Very powerful

•  In fact, it can do anything

•  But… you can’t combine Runners

•  Parameterized + SpringRunner à no way

Page 9: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

JUnit 4… Rules… are meant to be broken •  JUnit 4.7: MethodRule à @Rule•  JUnit 4.9: TestRule à @Rule / @ClassRule

•  Great for simple use cases

•  Can even be combined

•  But… a single rule can’t be used for method-level and class-level callbacks

•  Plus… zero support for instance-level callbacks

•  Case in point: SpringClassRule / SpringMethodRule

Page 10: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

JUnit Lambda – Crowdfunding Campaign •  Initiated by Johannes Link and Marc Philipp

•  Later joined by Matthias Merdes, Stefan Bechtold, & Sam Brannen

•  Ran from July to October 2015

•  Raised 53,937 Euros from 474 individuals and companies

•  4 companies donated 6 weeks of developer time

Page 11: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

Thanks!

Page 12: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

The Kick-off Team

Page 13: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

JUnit 5

Page 14: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

Roadmap •  Prototype à December 2nd, 2015

•  5.0.0-ALPHA à February 1st, 2016

•  6 Milestones à July 2016 – July 2017

•  2-3 Release Candidates à July 2017 – August 2017

•  5.0.0 GA à September 10th, 2017 ✅

•  5.0.1 à Today! (October 3rd, 2017) ✅

Page 15: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

JUnit 5 – in a Nutshell •  Modular

•  Extensible

•  Modern

•  Forward and backward compatible

•  JUnit Platform supports JUnit 3.8, JUnit 4, and JUnit 5

•  New testing frameworks can be run with JUnit 4 infrastructureo  @RunWith(JUnitPlatform.class)

Page 16: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

JUnit 5 – Java Versions •  Java 8

•  baseline

•  but can be used to test application code compiled against previous JDK versions

•  Java 9

•  #WorksFineOnJDK9

•  every artifact has a stable AUTOMATIC-MODULE-NAME•  module-path scanning support coming in 5.1

Page 17: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

JUnit 5 = Platform + Jupiter + Vintage •  JUnit Platform 1.0.0

•  Foundation for launching testing frameworks on the JVM

•  Launcher and TestEngine APIs

•  ConsoleLauncher, Gradle plugin, Maven Surefire provider

•  JUnit Jupiter 5.0.0•  New programming model and extension model for JUnit 5

•  JUnit Vintage 4.12.0•  TestEngine for running JUnit 3 and JUnit 4 based tests

Revolutionary

Evolutionary

Necessary

Page 18: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

Launcher API •  Used by IDEs and build tools to launch the framework

•  Central API for discovering and executing tests via one or more engines

•  LauncherDiscoveryRequest•  selectors and filters

•  Feedback provided via the TestExecutionListener API

•  ConsoleLauncher for command-line support

Page 19: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

TestEngine API •  Test engine discovers and executes tests

•  for a particular programming model

•  Automatic registration via Java’s ServiceLoader mechanism

•  JupiterTestEngine

•  VintageTestEngine

•  Implement your own…

Page 20: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

Third-party TestEngines •  Specsy

•  Spek

•  Cucumber

•  Drools Scenario

•  jqwik

source: https://github.com/junit-team/junit5/wiki/Third-party-Extensions

Page 21: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

P L A T F O R M

J U P I T E R V I N T A G E P A R T Y T H I R D

Page 22: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

PL

AT

FO

RM

JU

PIT

ER

VIN

TA

GE

PA

RT

Y

TH

IRD

Page 23: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

IDEs and Build Tools •  IntelliJ: ✅ IDEA 2016.2+

•  Eclipse: ✅ Eclipse Oxygen 4.7.1a (to be released next week)

•  NetBeans: 🙉🙈🙊

•  Gradle: interim solution from JUnit Team•  to be taken over by Gradle team (end of 2017)•  Android JUnit 5: third-party Android support

•  Maven: interim solution from JUnit Team•  being taken over by Maven Surefire team

See user guide andsample apps for examples

Page 24: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

JUnit Jupiter – Extension Model •  Extension

•  marker interface

•  org.junit.jupiter.api.extension•  package containing all extension APIs •  implement as many as you like

•  @ExtendWith(...)•  used to register one or more extensions •  interface, class, or method level

o  or as a meta-annotation

Page 25: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

Extension APIs •  BeforeAllCallback

•  BeforeEachCallback•  BeforeTestExecutionCallback•  AfterTestExecutionCallback

•  AfterEachCallback•  AfterAllCallback•  TestExecutionExceptionHandler •  ExecutionCondition•  TestInstancePostProcessor•  ParameterResolver•  TestTemplateInvocationContextProvider

Lifecycle Callbacks

Dependency Injection

Page 26: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

JUnit Jupiter – Programming Model org.junit.jupiter.api (org.junit.jupiter.params)

•  Annotations and meta-annotations•  Assertions and Assumptions•  Custom display names•  Visibility•  Tagging•  Conditional test execution•  Dependency injection for constructors and methods•  Lambda expressions and method references•  Interface default methods•  Nested test classes•  Repeated tests, parameterized tests, dynamic tests

Page 27: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

Annotations •  @Test / @TestFactory and @Testable for TestEngine implementors•  @RepeatedTest / @ParameterizedTest and @TestTemplate•  @Nested•  @TestInstance•  @BeforeAll / @AfterAll•  @BeforeEach / @AfterEach

•  @DisplayName•  @Tag•  @Disabled

Page 28: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

JUnit 4 Rule Migration Support •  @EnableRuleMigrationSupport

o  located in experimental junit-jupiter-migrationsupport moduleo  registers 3 extensions for JUnit Jupiter

•  ExternalResourceSupporto  TemporaryFolder, etc.

•  VerifierSupporto  ErrorCollector, etc.

•  ExpectedExceptionSupporto  ExpectedExceptiono  minor bug in 5.0.0; fixed in 5.0.1

Page 29: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

Assertions org.junit.jupiter.api.Assertions

•  Limited set of core assertions•  assertEquals(), assertNotNull(), etc.•  assertThrows() – λ•  assertTimeout() and assertTimeoutPreemptively() – λ•  assertAll() – λ

•  Supplier<String> à λ for lazy failure message evaluation•  message is now the last parameter

•  For more power, use AssertJ, Hamcrest, etc.

Page 30: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

Assumptions org.junit.jupiter.api.Assumptions

•  Limited set of core assumptions

•  For aborting tests mid-flight

•  Otherwise, favor a custom ExecutionCondition for skipping

•  assumeTrue() / assumeFalse()•  BooleanSupplier, Supplier<String> – λ

•  assumingThat( ? , () -> {} ); – λ

Page 31: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

LIVE CODING DEMO from JUnit 4 to JUnit Jupiter

Page 32: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

Tagging

@Tag("fast")@Testvoid myFastTest() {}

•  Declare @Tag on a test interface, class, or method

Page 33: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

Custom Tags

@Target(METHOD)@Retention(RUNTIME)@Tag("fast")public @interface Fast {}

•  Declare @Tag as a meta-annotation

@Fast@Testvoid myFastTest() {}

Page 34: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

Composed Tags

@Target(METHOD)@Retention(RUNTIME)@Tag("fast")@Testpublic @interface FastTest {}

•  Declare @Tag as a meta-annotation with other annotations (JUnit, Spring, etc.)

@FastTestvoid myFastTest() {}

Page 35: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

Test Names •  Names default to test class or test method names

•  characters limited based on Java syntax

•  Custom display names à @DisplayName•  Can contain spaces, special chars, and even emoji 😱

Page 36: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

Dependency Injection •  Extension Model meets Programming Model

•  ParameterResolver extension API

•  resolves parameters for constructors or method

o  not just @Test and lifecycle methods

•  can register multiple simultaneously

•  only one wins

•  Use cases

•  server URL, DataSource, Spring ApplicationContext, etc.

Page 37: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

TestInfo •  TestInfo: inject into constructor, @Test, @BeforeEach, etc.

•  access display name, tags, class, method

•  TestInfoParameterResolver•  eating our own dog food ;-)

•  See also:•  RepetitionInfo for @RepeatedTest•  TestReporter•  MockitoExtension•  SpringExtension

Page 38: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

LIVE CODING DEMO tags, display names, and dependency injection

Page 39: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

Conditional Test Execution •  Extension Model meets Programming Model

•  ExecutionCondition

•  @Disabled•  DisabledCondition

•  eating our own dog food ;-)

•  Deactivate via Launcher, system property, or junit-platform.properties file

•  junit.conditions.deactivate = org.junit.*

Game Changer

Page 40: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

Interface Default Methods •  Introduces the concept of a test interface

•  Enables multiple inheritance in tests•  a.k.a., testing traits

•  @BeforeAll / @AfterAll•  if using @TestInstance(Lifecyle.PER_CLASS)

•  @BeforeEach / @AfterEach•  @Test / @RepeatedTest / @ParameterizedTest / @TestFactory•  @Tag•  @ExtendWith

•  See StringTests and TestInterfaceDemo examples in user guide

Page 41: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

DEMO default methods

Page 42: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

Nested Test Classes •  Enables logical, hierarchical grouping of test classes

•  with shared initialization and state from outer classes

•  Declare @Nested on non-static nested classes

•  i.e., inner classes

•  You can even combine nested classes and test interfaces

•  See TestingAStack example in user guide and Bowling Game Kata by Tim Riemer

Page 43: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

DEMO nested test classes

Page 44: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

Repeated Tests •  Annotate a method with @RepeatedTest instead of @Test

o  and specify the number of repetitions

•  Optionally have the RepetitionInfo injected as a method parameter

•  Optionally override the display name

Page 45: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

@RepeatedTest in Action

@RepeatedTest(5)void repeatedTest(RepetitionInfo repetitionInfo) {

assertEquals(5, repetitionInfo.getTotalRepetitions());}

@RepeatedTest( value = 5, name = "Wiederholung {currentRepetition} von {totalRepetitions}”)void repeatedTestInGerman() {

// ...}

Page 46: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

Parameterized Tests (junit-jupiter-params)

•  Annotate a method with @ParameterizedTest instead of @Testo  and specify the source of the arguments

o  optionally override the display name

•  Sources

o  @ValueSource: String, int, long, double

o  @EnumSourceo  @MethodSourceo  @CsvSource & @CsvFileSourceo  @ArgumentsSource & custom ArgumentsProvider

Page 47: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

Argument Conversion •  Implicit conversion

o  Primitive types and their wrappers

o  Enums

o  java.time types (JSR-310)

•  Explicit conversion

o  @ConvertWith and custom ArgumentConvertero  @JavaTimeConversionPattern built-in support for JSR-310

Page 48: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

@ParameterizedTest in Action

@ParameterizedTest@ValueSource(strings = { "mom", "dad", "radar", "racecar", "able was I ere I saw elba"})void palindromes(String candidate) {

assertTrue(isPalindrome(candidate));}

Page 49: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

LIVE CODING DEMO repeated and parameterized tests

Page 50: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

Dynamic Tests •  Conventional tests are static (i.e., known at compile time)

•  @Test

•  A DynamicTest is registered at runtime – λ•  as lambda expression in a stream, collection, etc.

•  by a method annotated with @TestFactory•  Can also register a DynamicContainer for dynamic nesting

•  Somewhat analogous to parameterized tests

•  just more… dynamic 🤓

Page 51: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

Dynamic Tests in Action

@TestFactoryStream<DynamicTest> dynamicTestsFromIntStream() { // Generates tests for the first 10 even integers. return IntStream.iterate(0, n -> n + 2) .limit(10) .mapToObj(n -> dynamicTest("test" + n, () -> assertTrue(n % 2 == 0)));}

Page 52: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

DEMO dynamic tests

Page 53: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

What’s Missing? •  Scenario tests

•  Ordering

•  Parallel execution

•  Execution in user-defined thread

•  Declarative test suites for the JUnit Platform

•  Java 9 module-path scanning

•  …

Page 54: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

Spring 5 + JUnit 5

Page 55: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

Spring Support for JUnit Jupiter •  Fully integrated in Spring Framework 5.0!

•  released last week 😎

•  Supports all Core Spring TestContext Framework features

•  Constructor and method injection via @Autowired, @Qualifier, @Value•  Conditional test execution via SpEL expressions

•  ApplicationContext configuration annotations

•  Also works with Spring Framework 4.3

https://github.com/sbrannen/spring-test-junit5

Page 56: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

Configuring JUnit Jupiter with Spring •  SpringExtension

•  @ExtendWith(SpringExtension.class)

•  @SpringJUnitConfig•  @ContextConfiguration + SpringExtension

•  @SpringJUnitWebConfig•  @SpringJUnitConfig + @WebAppConfiguration

•  @EnabledIf / @DisabledIf•  SpEL expression evaluation for conditional execution

Page 57: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

DEMO Spring 5 and JUnit Jupiter

@EnabledOnMac / @DisabledOnMac

Page 58: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

Spring Boot 1.4 + JUnit 5 – Custom Config

@Target(TYPE)@Retention(RUNTIME)

@ExtendWith(SpringExtension.class)@SpringBootTest(webEnvironment = MOCK)@AutoConfigureMockMvc@Transactionalpublic @interface SpringEventsWebTest {}

•  @SpringBootTest + @AutoConfigureMockMvc + @ExtendWith(SpringExtension.class)

Page 59: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

Spring Boot 1.4 + JUnit 5 – MockMvc Test

@SpringEventsWebTestclass EventsControllerTests {

@Test @DisplayName("Home page should display more than 10 events") void listEvents(@Autowired MockMvc mockMvc) throws Exception { mockMvc.perform(get("/")) .andExpect(view().name("event/list")) .andExpect(model().attribute("events", hasSize(greaterThan(10)))); }}

•  @SpringEventsWebTest + method-level DI + MockMvc

Page 60: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

In closing …

Page 61: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

JUnit 5 Resources Project Homepage à http://junit.org/junit5

User Guide à http://junit.org/junit5/docs/current/user-guide

Javadoc à http://junit.org/junit5/docs/current/api

GitHub à https://github.com/junit-team

Gitter à https://gitter.im/junit-team/junit5

Stack Overflow à http://stackoverflow.com/tags/junit5

Page 62: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

Spring Resources Spring Framework à http://projects.spring.io/spring-framework

Spring Guides à http://spring.io/guides

Spring JIRA à https://jira.spring.io

Spring on GitHub à https://github.com/spring-projects/spring-framework

Stack Overflow à spring, spring-test, spring-mvc, spring-boot, …

Page 63: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

Additional JUnit 5 Talks @ JavaOne 2017 JUnit 5 BOF

Tuesday, Oct 03, 6:45 p.m. - 7:30 p.m. | Moscone West - Room 2016

JUnit5: Features, Architecture, and Extensibility

Wednesday, Oct 04, 2:45 p.m. - 3:30 p.m. | Moscone West - Room 2009

Page 64: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

Demos Used in this Presentation https://github.com/sbrannen/junit5-demo

Page 65: JUnit - RainFocus · #JavaOne #JUnit5 @sam_brannen Experts in Spring and Enterprise Java Areas of expertise • Spring * • JUnit 5 • Java EE • Software Architecture

@sam_brannen #JavaOne #JUnit5

Q & A Sam Brannen

JUnit