Skip to content

Commit

Permalink
Improve condition extensions
Browse files Browse the repository at this point in the history
  • Loading branch information
nipa committed Jan 6, 2017
1 parent b91baa5 commit 0cf3183
Show file tree
Hide file tree
Showing 7 changed files with 62 additions and 23 deletions.
Expand Up @@ -6,5 +6,5 @@
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
@ExtendWith(DisabledIfTestFailedCondition.class)
@ExtendWith(CollectExceptionExtension.class)
public @interface CollectExceptions { }
38 changes: 38 additions & 0 deletions src/main/java/org/codefx/demo/junit5/DisabledCondition.java
@@ -0,0 +1,38 @@
package org.codefx.demo.junit5;

import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.extension.ConditionEvaluationResult;
import org.junit.jupiter.api.extension.ContainerExecutionCondition;
import org.junit.jupiter.api.extension.ContainerExtensionContext;
import org.junit.jupiter.api.extension.TestExecutionCondition;
import org.junit.jupiter.api.extension.TestExtensionContext;
import org.junit.platform.commons.util.AnnotationUtils;

import java.lang.reflect.AnnotatedElement;
import java.util.Optional;

/**
* An exemplary reimplementation of the extension supporting the {@link Disabled @Disabled} annotation.
*/
public class DisabledCondition implements ContainerExecutionCondition, TestExecutionCondition {

private static final ConditionEvaluationResult ENABLED =
ConditionEvaluationResult.enabled("@Disabled is not present");

@Override
public ConditionEvaluationResult evaluate(ContainerExtensionContext context) {
return evaluateIfAnnotated(context.getElement());
}

@Override
public ConditionEvaluationResult evaluate(TestExtensionContext context) {
return evaluateIfAnnotated(context.getElement());
}

private ConditionEvaluationResult evaluateIfAnnotated(Optional<AnnotatedElement> element) {
return element.filter(el -> AnnotationUtils.isAnnotated(el, Disabled.class))
.map(el -> ConditionEvaluationResult.disabled(el + " is @Disabled"))
.orElse(ENABLED);
}

}
Expand Up @@ -13,12 +13,13 @@ public class DisabledIfTestFailedCondition implements TestExecutionCondition {

@Override
public ConditionEvaluationResult evaluate(TestExtensionContext context) {
Optional<DisabledIfTestFailedWith> disabled =
AnnotationUtils.findAnnotation(context.getElement(), DisabledIfTestFailedWith.class);
if (disabled.isPresent())
return disableIfExceptionWasThrown(context, disabled.get().value());
Class<? extends Exception>[] exceptionTypes = context.getTestClass()
.flatMap(testClass -> AnnotationUtils.findAnnotation(testClass, DisabledIfTestFailedWith.class))
.orElseThrow(() -> new IllegalStateException("The extension should not be executed "
+ "unless the test class is annotated with @DisabledIfTestFailedWith."))
.value();

return ConditionEvaluationResult.enabled("");
return disableIfExceptionWasThrown(context, exceptionTypes);
}

private ConditionEvaluationResult disableIfExceptionWasThrown(
Expand Down
Expand Up @@ -2,13 +2,17 @@

import org.junit.jupiter.api.extension.ExtendWith;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@ExtendWith(CollectExceptionExtension.class)
@ExtendWith(DisabledIfTestFailedCondition.class)
public @interface DisabledIfTestFailedWith {

Class<? extends Exception>[] value() default {};
Class<? extends Exception>[] value();

}
2 changes: 1 addition & 1 deletion src/main/java/org/codefx/demo/junit5/DisabledOnOs.java
Expand Up @@ -9,6 +9,6 @@
@ExtendWith(OsCondition.class)
public @interface DisabledOnOs {

OS[] value() default {};
OS[] value();

}
2 changes: 1 addition & 1 deletion src/main/java/org/codefx/demo/junit5/TestExceptOnOs.java
Expand Up @@ -11,6 +11,6 @@
@Test
public @interface TestExceptOnOs {

OS[] value() default {};
OS[] value();

}
@@ -1,33 +1,29 @@
package org.codefx.demo.junit5.extensions;

import org.codefx.demo.junit5.CollectExceptions;
import org.codefx.demo.junit5.DisabledIfTestFailedWith;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertFalse;

@CollectExceptions
@DisabledIfTestFailedWith(RuntimeException.class)
class DisabledIfFailsTest {

private static boolean failedFirst = false;
private static boolean ONE_TEST_FAILED = false;

@Test
void a_throwException() {
System.out.println("I failed!");
failedFirst = true;
throw new RuntimeException();
void assertNoTestFailed_thenFail_1() {
assertThenFail();
}

@Test
void b_disableIfOtherFailedFirst() {

/*
* TODO it looks like this does not work either.
*/
void assertNoTestFailed_thenFail_2() {
assertThenFail();
}

System.out.println("Nobody failed yet! (Right?)");
assertFalse(failedFirst);
private void assertThenFail() {
assertFalse(ONE_TEST_FAILED, "No test should run after another failed!");
ONE_TEST_FAILED = true;
throw new RuntimeException("I'm failing on purpose.");
}

}

0 comments on commit 0cf3183

Please sign in to comment.