Skip to content

Relocate ParameterInfo to params package and deprecate existing interface #4919

@marcphilipp

Description

@marcphilipp

Overview

As can be seen below, org.junit.jupiter.params.support.ParameterInfo causes cycles between the jupiter.params.aggregator and jupiter.params.support packages in junit-jupiter-params.

Cycle detected: Slice jupiter.params.aggregator -> 
                Slice jupiter.params.support -> 
                Slice jupiter.params.aggregator
  1. Dependencies of Slice jupiter.params.aggregator
    - Method <org.junit.jupiter.params.aggregator.ArgumentsAggregator.aggregateArguments(org.junit.jupiter.params.aggregator.ArgumentsAccessor, org.junit.jupiter.params.support.FieldContext)> has parameter of type <org.junit.jupiter.params.support.FieldContext> in (ArgumentsAggregator.java:0)
    - Method <org.junit.jupiter.params.aggregator.SimpleArgumentsAggregator.aggregateArguments(org.junit.jupiter.params.aggregator.ArgumentsAccessor, org.junit.jupiter.params.support.FieldContext)> has parameter of type <org.junit.jupiter.params.support.FieldContext> in (SimpleArgumentsAggregator.java:0)
    - Method <org.junit.jupiter.params.aggregator.SimpleArgumentsAggregator.aggregateArguments(org.junit.jupiter.params.aggregator.ArgumentsAccessor, org.junit.jupiter.params.support.FieldContext)> calls method <org.junit.jupiter.params.support.FieldContext.getField()> in (SimpleArgumentsAggregator.java:44)
    - Method <org.junit.jupiter.params.aggregator.SimpleArgumentsAggregator.aggregateArguments(org.junit.jupiter.params.aggregator.ArgumentsAccessor, org.junit.jupiter.params.support.FieldContext)> calls method <org.junit.jupiter.params.support.FieldContext.getParameterIndex()> in (SimpleArgumentsAggregator.java:44)
  2. Dependencies of Slice jupiter.params.support
    - Method <org.junit.jupiter.params.support.ParameterInfo.getArguments()> has return type <org.junit.jupiter.params.aggregator.ArgumentsAccessor> in (ParameterInfo.java:0)

Since the junit-jupiter-params artifact is part of the public API for JUnit Jupiter, we have traditionally not allowed package cycles within that artifact.

Thus, in order to reduce package cycles and improve the quality of the code base, we should relocate ParameterInfo to the org.junit.jupiter.params package and deprecate the existing class.

Specifically, I am proposing the following.

  1. Introduce org.junit.jupiter.params.ParameterInfo as a copy of org.junit.jupiter.params.support.ParameterInfo.
  2. Declare org.junit.jupiter.params.ParameterInfo as a sealed type permitting only org.junit.jupiter.params.support.ParameterInfo as a subtype.
  3. Have org.junit.jupiter.params.support.ParameterInfo extend org.junit.jupiter.params.ParameterInfo.
  4. Deprecate org.junit.jupiter.params.support.ParameterInfo for removal.
  5. Update all APIs that reference org.junit.jupiter.params.support.ParameterInfo to reference org.junit.jupiter.params.ParameterInfo instead.

Since org.junit.jupiter.params.support.ParameterInfo is a relatively new API (introduced in 5.13), we assume that it is not actively used by many projects yet. In light of that, we are considering making these breaking changes for JUnit 6.0.

However, we hope that affected users will only need to change their imports from org.junit.jupiter.params.support.ParameterInfo to org.junit.jupiter.params.ParameterInfo to address any issues.

Related Issues

Metadata

Metadata

Assignees

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions