Skip to content

Migration from JUnit4 to JUnit Jupiter

Andreas Schmid edited this page Nov 11, 2017 · 1 revision

JUnit Jupiters @TestTemplate

Since: v2.0

Examples

All examples can be found as integration / acceptance tests in junit-jupiters package com.tngtech.test.junit.dataprovider.

Dependencies

  • Replace test dependency org.junit:junit with org.junit.jupiter:junit-jupiter-engine

    • Hint: Currently thinking about only using org.junit.jupiter:junit-jupiter-api with lack of ParameterResolver support for dataprovider methods
    • Hint2: see also JUnit5 Migration Tips
  • Replace test dependency com.tngtech.java:junit-dataprovider or com.tngtech.junit.dataprovider:junit4-dataprovider with com.tngtech.junit.dataprovider:junit-jupiter-dataprovider

Test code

  • JUnit dataprovider annotations are moved from com.tngtech.java.junit.dataprovider to com.tngtech.junit.dataprovider

  • Replace @RunWith(DataProviderRunner.class) with

    • @ExtendWith(UseDataProviderExtension.class) for using @UseDataProvider and dataprovider methods or
    • @ExtendWith(DataProviderExtension.class) for using @DataProvider and @DataProvider#value() to provide test data
  • Replace @Test with @TestTemplate

    • Eclipse search replace if @Test is before dataprovider annotation: @Test(\s*)@(Use)?DataProvider --> @TestTemplate$1@$2DataProvider
  • Replace usage of FrameworkMethod in a dataprovider method with TestInfo

    • TestInfo#getTestMethod() will provide an Optional<Method> which always contains a test method using it with JUnit dataprovider
    • Note: within a dataprovider method one can new use every parameter resolvable by Parameter Resolution
  • One might organize imports for all changed tests files

  • Optional: Replace format placeholder %p with %a

    • Note: %p is only deprecated but not removed yet

Framework code

Custom resolver

  • Complete resolvers code is completely refactored and resides in core package com.tngtech.junit.dataprovider.resolver now.

  • ResolverStrategy was moved to separate class

  • Usage of JUnit4s FrameworkMethod was replaced with Javas Method

  • Usage of JUnit4s TestClass was replaced with Class<?>

  • Note: Method and Class<?> have a lot less features, compared to FrameworkMethod and TestClass but you can use JUnit Jupiters AnnotationSupport and / or ReflectionSupport instead

Custom placeholder

  • Placeholders reside in core package com.tngtech.junit.dataprovider.placeholder now.
  • Placeholders class to customize used placeholders is removed in favor of creating custom (meta) annotations
    • An example can be found here
  • ParameterPlaceholder is renamed to ArgumentPlaceholder because it handles arguments instead of parameters
    • Method formatAll(Object[]) is changed to formatAll(List<Object>)

Custom converter

Custom DataConverter
  • A custom DataConverter can be used by creating a custom (meta) annotation
    • As a starting point you can use CustomConverterDataProviderExtension from here and use constructor DataProviderInvocationContextProvider(Class, DataConverter) or UseDataProviderInvocationContextProvider(Class, Class, DataConverter) with your custom DataConverter instead
Custom *Converter
  • A custom *Converter can be provided
    • via @DataProvider annotation,
    • by creating a custom (meta) annotation, or
    • as default in a custom extension.
  • Examples and starting points can be found here.
Custom ObjectArrayConverter
Custom SingleArgConverter
Custom StringConverter

Custom TestGenerator and TestValidator

  • Removed TestGenerator and put the logic to AbstractDataProviderInvocationContextProvider and UseDataProviderInvocationContextProvider

    • protected TestGenerator#generateExplodedTestMethodsFor(...) --> no pendant available as JUnit Jupiter behaves completely different
    • TestGenerator#explodeTestMethod(...) --> UseDataProviderInvocationContextProvider#invokeDataProviderMethodToRetrieveData(...)
    • TestGenerator#explodeTestMethod(...) --> AbstractDataProviderInvocationContextProvider#convertData(...)
  • Removed TestValidator entirely to adapt to JUnit Jupiter behavior which does not validate test cases beforehand

New features and behavioral changes

  • TODO is there more?

New features

  • JUnit dataprovider methods must no longer be public (same as test methods in JUnit Jupiter)
  • JUnit dataprovider methods must no longer be static if and only if class is annotated with @TestInstance(Lifecycle.PER_CLASS)
  • JUnit dataprovider annotation can be used as meta-annotations to be able to create custom composed annotations
  • Test methods used with JUnit dataprovider can now have additional test method parameters according to ParameterResolver extensions, e.g. TestInfo
    • Note: This does not work for test methods having a varargs parameter
    • JUnit Jupter documentation

Behavioral changes

  • Default format of a dataprovider test has changed to [%i: %a[0..-1]] without method (%m) prefix
    • Reason: JUnit Jupiter already provides grouping tests by test method by default