From a409b27b1fca748a504a8bbcf7a914eeadeebdab Mon Sep 17 00:00:00 2001 From: Sam Brannen Date: Mon, 23 May 2016 13:46:12 +0200 Subject: [PATCH] Introduce getTest[Class|Method]() in TestInfo & ExtensionContext This commit introduces Optional> getTestClass() and Optional getTestMethod() methods in TestInfo and ExtensionContext. The existing `Class getTestClass()` method in ExtensionContext has simply been replaced, and the existing `Method getTestMethod()` method in TestExtensionContext has been removed. Issue: #153 --- .../java/example/timing/TimingExtension.java | 4 +-- .../junit/gen5/engine/junit5/FullLogging.java | 28 +++++++++-------- .../execution/ExtensionContextTests.java | 8 ++--- .../java/org/junit/gen5/api/TestInfo.java | 13 ++++++++ .../gen5/api/extension/ExtensionContext.java | 13 ++++++-- .../api/extension/TestExtensionContext.java | 3 -- .../ClassBasedContainerExtensionContext.java | 13 ++++++-- .../MethodBasedTestExtensionContext.java | 11 ++++--- .../descriptor/MethodTestDescriptor.java | 2 +- .../extension/TestInfoParameterResolver.java | 31 ++++++++++++++----- 10 files changed, 84 insertions(+), 42 deletions(-) diff --git a/documentation/src/test/java/example/timing/TimingExtension.java b/documentation/src/test/java/example/timing/TimingExtension.java index dfa0f7f66db3..08a25724561f 100644 --- a/documentation/src/test/java/example/timing/TimingExtension.java +++ b/documentation/src/test/java/example/timing/TimingExtension.java @@ -31,12 +31,12 @@ public class TimingExtension implements BeforeTestMethodCallback, AfterTestMetho @Override public void beforeTestMethod(TestExtensionContext context) throws Exception { - getStore(context).put(context.getTestMethod(), System.currentTimeMillis()); + getStore(context).put(context.getTestMethod().get(), System.currentTimeMillis()); } @Override public void afterTestMethod(TestExtensionContext context) throws Exception { - Method testMethod = context.getTestMethod(); + Method testMethod = context.getTestMethod().get(); long start = (long) getStore(context).remove(testMethod); long duration = System.currentTimeMillis() - start; diff --git a/junit-tests/src/test/java/org/junit/gen5/engine/junit5/FullLogging.java b/junit-tests/src/test/java/org/junit/gen5/engine/junit5/FullLogging.java index 14196d72f9a0..63bbdef2b891 100644 --- a/junit-tests/src/test/java/org/junit/gen5/engine/junit5/FullLogging.java +++ b/junit-tests/src/test/java/org/junit/gen5/engine/junit5/FullLogging.java @@ -53,20 +53,22 @@ class Extension implements BeforeAllCallback, AfterAllCallback { @Override public void beforeAll(ContainerExtensionContext context) throws Exception { - // @formatter:off - Class[] loggerClasses = findAnnotation(context.getTestClass(), FullLogging.class) - .orElseThrow(() -> new PreconditionViolationException("@FullLogging must be declared on class " + - context.getTestClass().getName())) - .value(); + Class testClass = context.getTestClass().get(); - Arrays.stream(loggerClasses) - .map(Class::getName) - .forEach(loggerName -> { - Logger logger = Logger.getLogger(loggerName); - previouslyActiveLogLevels.put(loggerName, logger.getLevel()); - logger.setLevel(Level.ALL); - }); - // @formatter:on + // @formatter:off + Class[] loggerClasses = findAnnotation(testClass, FullLogging.class) + .orElseThrow(() -> new PreconditionViolationException("@FullLogging must be declared on class " + + testClass.getName())) + .value(); + + Arrays.stream(loggerClasses) + .map(Class::getName) + .forEach(loggerName -> { + Logger logger = Logger.getLogger(loggerName); + previouslyActiveLogLevels.put(loggerName, logger.getLevel()); + logger.setLevel(Level.ALL); + }); + // @formatter:on } @Override diff --git a/junit-tests/src/test/java/org/junit/gen5/engine/junit5/execution/ExtensionContextTests.java b/junit-tests/src/test/java/org/junit/gen5/engine/junit5/execution/ExtensionContextTests.java index e583191a401c..6048c31108c7 100644 --- a/junit-tests/src/test/java/org/junit/gen5/engine/junit5/execution/ExtensionContextTests.java +++ b/junit-tests/src/test/java/org/junit/gen5/engine/junit5/execution/ExtensionContextTests.java @@ -38,6 +38,7 @@ * Microtests for implementors of {@linkplain ExtensionContext}: * {@linkplain ClassBasedContainerExtensionContext} and * {@linkplain MethodBasedTestExtensionContext} + * * @since 5.0 */ public class ExtensionContextTests { @@ -50,7 +51,7 @@ public void fromClassTestDescriptor() { ClassBasedContainerExtensionContext outerExtensionContext = new ClassBasedContainerExtensionContext(null, null, outerClassDescriptor); Assertions.assertAll("outerContext", // - () -> assertEquals(OuterClass.class, outerExtensionContext.getTestClass()), // + () -> assertEquals(OuterClass.class, outerExtensionContext.getTestClass().get()), // () -> assertEquals(outerClassDescriptor.getDisplayName(), outerExtensionContext.getDisplayName()), // () -> assertEquals(Optional.empty(), outerExtensionContext.getParent()) // ); @@ -87,7 +88,6 @@ public void tagsCanBeRetrievedInExtensionContext() { () -> assertEquals(2, testExtensionContext.getTags().size()), // () -> assertTrue(testExtensionContext.getTags().contains("outer-tag"), "outer-tag missing"), // () -> assertTrue(testExtensionContext.getTags().contains("method-tag"), "method-tag missing")); - } @Test @@ -100,7 +100,7 @@ public void fromMethodTestDescriptor() { MethodBasedTestExtensionContext testExtensionContext = new MethodBasedTestExtensionContext( classExtensionContext, null, methodTestDescriptor, new OuterClass()); Assertions.assertAll("methodContext", // - () -> assertEquals(OuterClass.class, testExtensionContext.getTestClass()), // + () -> assertEquals(OuterClass.class, testExtensionContext.getTestClass().get()), // () -> assertEquals(methodTestDescriptor.getDisplayName(), testExtensionContext.getDisplayName()), // () -> assertEquals(classExtensionContext, testExtensionContext.getParent().get()), // () -> assertEquals(OuterClass.class, testExtensionContext.getTestInstance().getClass()) // @@ -188,12 +188,10 @@ static class OuterClass { @Tag("nested-tag") class NestedClass { - } @Tag("method-tag") void aMethod() { - } } diff --git a/junit5-api/src/main/java/org/junit/gen5/api/TestInfo.java b/junit5-api/src/main/java/org/junit/gen5/api/TestInfo.java index dcc5bdef9fcb..5b8689e34b4e 100644 --- a/junit5-api/src/main/java/org/junit/gen5/api/TestInfo.java +++ b/junit5-api/src/main/java/org/junit/gen5/api/TestInfo.java @@ -12,6 +12,8 @@ import static org.junit.gen5.commons.meta.API.Usage.Experimental; +import java.lang.reflect.Method; +import java.util.Optional; import java.util.Set; import org.junit.gen5.commons.meta.API; @@ -56,4 +58,15 @@ public interface TestInfo { * or "inherited" from an outer context. */ Set getTags(); + + /** + * Get the {@link Class} associated with the current test, if available. + */ + Optional> getTestClass(); + + /** + * Get the {@link Method} associated with the current test, if available. + */ + Optional getTestMethod(); + } diff --git a/junit5-api/src/main/java/org/junit/gen5/api/extension/ExtensionContext.java b/junit5-api/src/main/java/org/junit/gen5/api/extension/ExtensionContext.java index 57862b066030..daf8a37de13d 100644 --- a/junit5-api/src/main/java/org/junit/gen5/api/extension/ExtensionContext.java +++ b/junit5-api/src/main/java/org/junit/gen5/api/extension/ExtensionContext.java @@ -13,6 +13,7 @@ import static org.junit.gen5.commons.meta.API.Usage.Experimental; import java.lang.reflect.AnnotatedElement; +import java.lang.reflect.Method; import java.util.Arrays; import java.util.HashSet; import java.util.Map; @@ -36,7 +37,7 @@ public interface ExtensionContext { /** - * Get the parent extension context if there is one. + * Get the parent extension context, if available. */ Optional getParent(); @@ -71,9 +72,15 @@ public interface ExtensionContext { Set getTags(); /** - * Get the {@link Class} associated with the current test or container. + * Get the {@link Class} associated with the current test or container, + * if available. */ - Class getTestClass(); + Optional> getTestClass(); + + /** + * Get the {@link Method} associated with the current test, if available. + */ + Optional getTestMethod(); /** * Get the {@link AnnotatedElement} corresponding to the current extension diff --git a/junit5-api/src/main/java/org/junit/gen5/api/extension/TestExtensionContext.java b/junit5-api/src/main/java/org/junit/gen5/api/extension/TestExtensionContext.java index f64c0a307005..793057496705 100644 --- a/junit5-api/src/main/java/org/junit/gen5/api/extension/TestExtensionContext.java +++ b/junit5-api/src/main/java/org/junit/gen5/api/extension/TestExtensionContext.java @@ -12,8 +12,6 @@ import static org.junit.gen5.commons.meta.API.Usage.Experimental; -import java.lang.reflect.Method; - import org.junit.gen5.commons.meta.API; /** @@ -27,5 +25,4 @@ public interface TestExtensionContext extends ExtensionContext { Object getTestInstance(); - Method getTestMethod(); } diff --git a/junit5-engine/src/main/java/org/junit/gen5/engine/junit5/descriptor/ClassBasedContainerExtensionContext.java b/junit5-engine/src/main/java/org/junit/gen5/engine/junit5/descriptor/ClassBasedContainerExtensionContext.java index a3b52b683983..a36824d044c6 100644 --- a/junit5-engine/src/main/java/org/junit/gen5/engine/junit5/descriptor/ClassBasedContainerExtensionContext.java +++ b/junit5-engine/src/main/java/org/junit/gen5/engine/junit5/descriptor/ClassBasedContainerExtensionContext.java @@ -13,6 +13,8 @@ import static org.junit.gen5.commons.meta.API.Usage.Internal; import java.lang.reflect.AnnotatedElement; +import java.lang.reflect.Method; +import java.util.Optional; import org.junit.gen5.api.extension.ContainerExtensionContext; import org.junit.gen5.api.extension.ExtensionContext; @@ -48,12 +50,17 @@ public String getDisplayName() { @Override public AnnotatedElement getElement() { - return getTestClass(); + return getTestClass().get(); } @Override - public Class getTestClass() { - return ((ClassTestDescriptor) getTestDescriptor()).getTestClass(); + public Optional> getTestClass() { + return Optional.of(((ClassTestDescriptor) getTestDescriptor()).getTestClass()); + } + + @Override + public Optional getTestMethod() { + return Optional.empty(); } } diff --git a/junit5-engine/src/main/java/org/junit/gen5/engine/junit5/descriptor/MethodBasedTestExtensionContext.java b/junit5-engine/src/main/java/org/junit/gen5/engine/junit5/descriptor/MethodBasedTestExtensionContext.java index 270cbf279f1d..ecb752f65057 100644 --- a/junit5-engine/src/main/java/org/junit/gen5/engine/junit5/descriptor/MethodBasedTestExtensionContext.java +++ b/junit5-engine/src/main/java/org/junit/gen5/engine/junit5/descriptor/MethodBasedTestExtensionContext.java @@ -14,6 +14,7 @@ import java.lang.reflect.AnnotatedElement; import java.lang.reflect.Method; +import java.util.Optional; import org.junit.gen5.api.extension.ExtensionContext; import org.junit.gen5.api.extension.TestExtensionContext; @@ -35,8 +36,8 @@ public MethodBasedTestExtensionContext(ExtensionContext parent, EngineExecutionL } @Override - public Method getTestMethod() { - return ((MethodTestDescriptor) getTestDescriptor()).getTestMethod(); + public Optional getTestMethod() { + return Optional.of(((MethodTestDescriptor) getTestDescriptor()).getTestMethod()); } @Override @@ -45,8 +46,8 @@ public Object getTestInstance() { } @Override - public Class getTestClass() { - return ((MethodTestDescriptor) getTestDescriptor()).getTestClass(); + public Optional> getTestClass() { + return Optional.of(((MethodTestDescriptor) getTestDescriptor()).getTestClass()); } @Override @@ -66,7 +67,7 @@ public String getDisplayName() { @Override public AnnotatedElement getElement() { - return getTestMethod(); + return getTestMethod().get(); } } diff --git a/junit5-engine/src/main/java/org/junit/gen5/engine/junit5/descriptor/MethodTestDescriptor.java b/junit5-engine/src/main/java/org/junit/gen5/engine/junit5/descriptor/MethodTestDescriptor.java index 3484fe8fd2c4..b60fb6503066 100644 --- a/junit5-engine/src/main/java/org/junit/gen5/engine/junit5/descriptor/MethodTestDescriptor.java +++ b/junit5-engine/src/main/java/org/junit/gen5/engine/junit5/descriptor/MethodTestDescriptor.java @@ -180,7 +180,7 @@ protected void invokeTestMethod(JUnit5EngineExecutionContext context, TestExtens throwableCollector.execute(() -> { MethodInvocationContext methodInvocationContext = methodInvocationContext( - testExtensionContext.getTestInstance(), testExtensionContext.getTestMethod()); + testExtensionContext.getTestInstance(), testExtensionContext.getTestMethod().get()); try { new MethodInvoker(testExtensionContext, context.getExtensionRegistry()).invoke(methodInvocationContext); } diff --git a/junit5-engine/src/main/java/org/junit/gen5/engine/junit5/extension/TestInfoParameterResolver.java b/junit5-engine/src/main/java/org/junit/gen5/engine/junit5/extension/TestInfoParameterResolver.java index cdff38b600ce..c52fda69e93e 100644 --- a/junit5-engine/src/main/java/org/junit/gen5/engine/junit5/extension/TestInfoParameterResolver.java +++ b/junit5-engine/src/main/java/org/junit/gen5/engine/junit5/extension/TestInfoParameterResolver.java @@ -10,7 +10,9 @@ package org.junit.gen5.engine.junit5.extension; +import java.lang.reflect.Method; import java.lang.reflect.Parameter; +import java.util.Optional; import java.util.Set; import org.junit.gen5.api.TestInfo; @@ -36,22 +38,25 @@ public boolean supports(Parameter parameter, MethodInvocationContext methodInvoc @Override public TestInfo resolve(Parameter parameter, MethodInvocationContext methodInvocationContext, - final ExtensionContext extensionContext) { + ExtensionContext extensionContext) { - return new DefaultTestInfo(extensionContext.getName(), extensionContext.getDisplayName(), - extensionContext.getTags()); + return new DefaultTestInfo(extensionContext); } private static class DefaultTestInfo implements TestInfo { private final String name; private final String displayName; + private final Optional> testClass; + private final Optional testMethod; private final Set tags; - DefaultTestInfo(String name, String displayName, Set tags) { - this.name = name; - this.displayName = displayName; - this.tags = tags; + DefaultTestInfo(ExtensionContext extensionContext) { + this.name = extensionContext.getName(); + this.displayName = extensionContext.getDisplayName(); + this.testClass = extensionContext.getTestClass(); + this.testMethod = extensionContext.getTestMethod(); + this.tags = extensionContext.getTags(); } @Override @@ -69,6 +74,16 @@ public Set getTags() { return tags; } + @Override + public Optional> getTestClass() { + return this.testClass; + } + + @Override + public Optional getTestMethod() { + return this.testMethod; + } + @Override public String toString() { // @formatter:off @@ -76,6 +91,8 @@ public String toString() { .append("name", this.name) .append("displayName", this.displayName) .append("tags", this.tags) + .append("testClass", this.testClass) + .append("testMethod", this.testMethod) .toString(); // @formatter:on }