A @BootstrapWith annotation should be considered an override for @BootstrapWith meta-annotations not only when the @BootstrapWith annotation is directly present on the test class but also if it is present on the an ancestor of the test class.
It is common to use a base test class such as:
@SpringBootTest
public abstract class BaseTest {
}
Annotating this BaseTest with @BootstrapWith(XXX) should not make tests extending this class fail with java.lang.IllegalStateException: Configuration error: found multiple declarations of @BootstrapWith but instead properly use the @BootstrapWith as an override of the bootstrap provided as a meta-annotation by @SpringBootTest.
Comment From: pivotal-issuemaster
@antoinemeyer Please sign the Contributor License Agreement!
Click here to manually synchronize the status of this Pull Request.
See the FAQ for frequently asked questions.
Comment From: pivotal-issuemaster
@antoinemeyer Thank you for signing the Contributor License Agreement!
Comment From: sbrannen
Hi @antoinemeyer,
Thanks for submitting the PR.
I agree that we should improve the behavior here.
Your PR addresses the exact use case you have described; however, it allows a directly present @BootstrapWith annotation on a super-type to silently override local @BootstrapWith meta-annotations, which is not what one would expect.
For example, given the following ...
@BootstrapWith(BarBootstrapper.class)
@Retention(RetentionPolicy.RUNTIME)
@interface BootWithBar {}
@BootstrapWith(FooBootstrapper.class)
static class DirectBootstrapClass {}
@BootWithBar
static class InheritedDirectBootstrapAndLocalMetaBootstrapClass extends DirectBootstrapClass {}
... your proposal results in FooBootstrapper being used instead of BarBootstrapper or an exception.
In summary, I think we should improve the situation for your specific use case, but we'll need to investigate how best to avoid the pitfall I outlined above.
In light of that, I'm scheduling this for 6.1.x.
Comment From: sbrannen
- superseded by #31485