Looking at the code of findAnnotation another question arises: Is there any reason, that @MeecrowaveConfig ist not @Inherited (that means can be put on a base-class of the test)?
I guess changing it now would be a breaking change? Cheers, Arne OPEN KNOWLEDGE GmbH Poststraße 1, 26122 Oldenburg Mobil: +49 151 - 108 22 942 Tel: +49 441 - 4082-154 Fax: +49 441 - 4082-111 arne.limb...@openknowledge.de www.openknowledge.de <https://www.openknowledge.de/> Registergericht: Amtsgericht Oldenburg, HRB 4670 Geschäftsführer: Lars Röwekamp, Jens Schumann Treffen Sie uns auf kommenden Konferenzen und Workshops: Zu unseren Events<https://www.openknowledge.de/event/> ________________________________ Von: Arne Limburg <arne.limb...@openknowledge.de> Gesendet: Mittwoch, 15. Juli 2020 19:23 An: dev@openwebbeans.apache.org Betreff: AW: [openwebbeans-meecrowave] branch master updated: MEECROWAVE-252: Add support for meta-annotations for JUnit 5 Yes, I didn't know it ;-) I'll change the code accordingly OPEN KNOWLEDGE GmbH Poststraße 1, 26122 Oldenburg Mobil: +49 151 - 108 22 942 Tel: +49 441 - 4082-154 Fax: +49 441 - 4082-111 arne.limb...@openknowledge.de www.openknowledge.de<http://www.openknowledge.de> <https://www.openknowledge.de/> Registergericht: Amtsgericht Oldenburg, HRB 4670 Geschäftsführer: Lars Röwekamp, Jens Schumann Treffen Sie uns auf kommenden Konferenzen und Workshops: Zu unseren Events<https://www.openknowledge.de/event/> ________________________________ Von: Romain Manni-Bucau <rmannibu...@gmail.com> Gesendet: Mittwoch, 15. Juli 2020 18:21 An: openwebbeans-dev Betreff: Fwd: [openwebbeans-meecrowave] branch master updated: MEECROWAVE-252: Add support for meta-annotations for JUnit 5 Hello Arne, Any reason to not use AnnotationUtils from junit5? AnnotationUtils.findAnnotation(extensionContext.getElement(), MeecrowaveConfig.class) Romain Manni-Bucau @rmannibucau <https://twitter.com/rmannibucau> | Blog <https://rmannibucau.metawerx.net/> | Old Blog <http://rmannibucau.wordpress.com> | Github <https://github.com/rmannibucau> | [https://secure.gravatar.com/blavatar/18ef8a5fe8eefd3810b5e9743904d82c?s=200&ts=1594834031]<http://rmannibucau.wordpress.com/> New posts here >>> rmannibucau.metawerx.net | New posts here >>> https://rmannibucau.metawerx.net<http://rmannibucau.wordpress.com/> rmannibucau.wordpress.com New posts here >>> https://rmannibucau.metawerx.net LinkedIn <https://www.linkedin.com/in/rmannibucau> | Book <https://www.packtpub.com/application-development/java-ee-8-high-performance> [https://www.packtpub.com/media/catalog/product/cache/5d165500a520a389deb95b325792ea25/b/0/b08602_cover_0.png]<https://www.packtpub.com/application-development/java-ee-8-high-performance> Java EE 8 High Performance<https://www.packtpub.com/application-development/java-ee-8-high-performance> www.packtpub.com Get more control of your applications performances in development and production and know how to meet your Service Level Agreement on critical microservices. ---------- Forwarded message --------- De : <a...@apache.org> Date: mer. 15 juil. 2020 à 17:12 Subject: [openwebbeans-meecrowave] branch master updated: MEECROWAVE-252: Add support for meta-annotations for JUnit 5 To: comm...@openwebbeans.apache.org <comm...@openwebbeans.apache.org> This is an automated email from the ASF dual-hosted git repository. arne pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/openwebbeans-meecrowave.git The following commit(s) were added to refs/heads/master by this push: new 19e8d3b MEECROWAVE-252: Add support for meta-annotations for JUnit 5 19e8d3b is described below commit 19e8d3baefd46fcbcafdba934413987dc85c9b47 Author: arne <a...@apache.org> AuthorDate: Wed Jul 15 17:12:00 2020 +0200 MEECROWAVE-252: Add support for meta-annotations for JUnit 5 --- .../meecrowave/junit5/MeecrowaveExtension.java | 44 +++++++++++++++++++--- .../junit5/MeecrowaveConfigMetaAnnotationTest.java | 34 +++++++++++++++++ .../junit5/MeecrowaveRequestScopedConfig.java | 15 ++++++++ 3 files changed, 88 insertions(+), 5 deletions(-) diff --git a/meecrowave-junit/src/main/java/org/apache/meecrowave/junit5/MeecrowaveExtension.java b/meecrowave-junit/src/main/java/org/apache/meecrowave/junit5/MeecrowaveExtension.java index e09792a..fd91ac7 100644 --- a/meecrowave-junit/src/main/java/org/apache/meecrowave/junit5/MeecrowaveExtension.java +++ b/meecrowave-junit/src/main/java/org/apache/meecrowave/junit5/MeecrowaveExtension.java @@ -18,12 +18,23 @@ */ package org.apache.meecrowave.junit5; +import static java.util.Arrays.asList; +import static java.util.Arrays.stream; +import static java.util.Collections.emptyList; import static java.util.Optional.ofNullable; +import static java.util.stream.Collectors.toSet; import java.io.File; import java.lang.annotation.Annotation; +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; +import java.lang.reflect.AnnotatedElement; import java.lang.reflect.Field; import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; import java.util.Optional; import javax.enterprise.context.spi.CreationalContext; @@ -39,16 +50,19 @@ import org.junit.jupiter.api.extension.ExtensionContext; public class MeecrowaveExtension extends BaseLifecycle implements BeforeAllCallback, AfterAllCallback, BeforeEachCallback, AfterEachCallback { - private static final ExtensionContext.Namespace NAMESPACE = ExtensionContext.Namespace.create(MeecrowaveExtension.class.getName()); + + private static final ExtensionContext.Namespace NAMESPACE = ExtensionContext.Namespace.create(MeecrowaveExtension.class.getName()); + + private static final List<Class<? extends Annotation>> DEFAULT_ANNOTATION_TYPES = asList(Retention.class, Target.class, Documented.class); private final ScopesExtension scopes = new ScopesExtension() { @Override protected Optional<Class<? extends Annotation>[]> getScopes(final ExtensionContext context) { return context.getElement() - .map(e -> ofNullable(e.getAnnotation(MeecrowaveConfig.class)) + .map(e -> getConfigAnnotation(asList(e.getAnnotations())) .orElseGet(() -> context.getParent() .flatMap(ExtensionContext::getElement) - .map(it -> it.getAnnotation(MeecrowaveConfig.class)) + .flatMap(it -> getConfigAnnotation(asList(it.getAnnotations()))) .orElse(null))) .map(MeecrowaveConfig::scopes) .filter(s -> s.length > 0); @@ -58,7 +72,8 @@ public class MeecrowaveExtension extends BaseLifecycle @Override public void beforeAll(final ExtensionContext context) { final Meecrowave.Builder builder = new Meecrowave.Builder(); - final Optional<MeecrowaveConfig> meecrowaveConfig = context.getElement().map(e -> e.getAnnotation(MeecrowaveConfig.class)); + final Optional<MeecrowaveConfig> meecrowaveConfig + = getConfigAnnotation(context.getElement().map(AnnotatedElement::getAnnotations).map(Arrays::asList).orElse(emptyList())); final String ctx; if (meecrowaveConfig.isPresent()) { final MeecrowaveConfig config = meecrowaveConfig.get(); @@ -134,7 +149,26 @@ public class MeecrowaveExtension extends BaseLifecycle } } - private void doRelease(final ExtensionContext context) { + private static Optional<MeecrowaveConfig> getConfigAnnotation(Collection<Annotation> annotations) { + while (!annotations.isEmpty()) { + Optional<MeecrowaveConfig> config = annotations.stream() + .filter(a -> a.annotationType().equals(MeecrowaveConfig.class)) + .map(a -> MeecrowaveConfig.class.cast(a)) + .findFirst(); + if (config.isPresent()) { + return config; + } + annotations = annotations + .stream() + .map(Annotation::annotationType) + .flatMap(a -> stream(a.getAnnotations())) + .filter(a -> !DEFAULT_ANNOTATION_TYPES.contains(a.annotationType())) + .collect(toSet()); + } + return Optional.empty(); + } + + private void doRelease(final ExtensionContext context) { ofNullable(context.getStore(NAMESPACE).get(CreationalContext.class, CreationalContext.class)) .ifPresent(CreationalContext::release); scopes.beforeEach(context); diff --git a/meecrowave-junit/src/test/java/org/apache/meecrowave/junit5/MeecrowaveConfigMetaAnnotationTest.java b/meecrowave-junit/src/test/java/org/apache/meecrowave/junit5/MeecrowaveConfigMetaAnnotationTest.java new file mode 100644 index 0000000..b7cb3fc --- /dev/null +++ b/meecrowave-junit/src/test/java/org/apache/meecrowave/junit5/MeecrowaveConfigMetaAnnotationTest.java @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0<http://www.apache.org/licenses/LICENSE-2.0> www.apache.org Home page of The Apache Software Foundation + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.meecrowave.junit5; + +import static org.junit.Assert.assertTrue; + +import javax.enterprise.context.RequestScoped; + +import org.apache.webbeans.config.WebBeansContext; +import org.junit.jupiter.api.Test; + +@MeecrowaveRequestScopedConfig +class MeecrowaveConfigMetaAnnotationTest { + @Test + void run() { + assertTrue(WebBeansContext.currentInstance().getContextsService().getCurrentContext(RequestScoped.class, false).isActive()); + } +} diff --git a/meecrowave-junit/src/test/java/org/apache/meecrowave/junit5/MeecrowaveRequestScopedConfig.java b/meecrowave-junit/src/test/java/org/apache/meecrowave/junit5/MeecrowaveRequestScopedConfig.java new file mode 100644 index 0000000..ee3d00d --- /dev/null +++ b/meecrowave-junit/src/test/java/org/apache/meecrowave/junit5/MeecrowaveRequestScopedConfig.java @@ -0,0 +1,15 @@ +package org.apache.meecrowave.junit5; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +import javax.enterprise.context.RequestScoped; + +import org.junit.platform.commons.annotation.Testable; + +@Testable +@Retention(RetentionPolicy.RUNTIME) +@MeecrowaveConfig(scopes = RequestScoped.class) +public @interface MeecrowaveRequestScopedConfig { + +}