Created
March 31, 2011 20:51
-
-
Save abyx/897229 to your computer and use it in GitHub Desktop.
Simple JUnit rule to make tests retry
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class RetrierTest { | |
private static int count = 0; | |
@Rule public RetryRule rule = new RetryRule(); | |
@Test | |
@Retry | |
public void failsFirst() throws Exception { | |
count++; | |
assertEquals(2, count); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@Retention(RetentionPolicy.RUNTIME) | |
public @interface Retry {} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class RetryRule implements MethodRule { | |
@Override public Statement apply(final Statement base, final FrameworkMethod method, Object target) { | |
return new Statement() { | |
@Override public void evaluate() throws Throwable { | |
try { | |
base.evaluate(); | |
} catch (Throwable t) { | |
Retry retry = method.getAnnotation(Retry.class); | |
if (retry != null) { | |
base.evaluate(); | |
} else { | |
throw t; | |
} | |
} | |
} | |
}; | |
} | |
} |
@tomdwp
public class RetryRule implements MethodRule {
private AtomicInteger retryCount;
public RetryRule() {
this(3);
}
public RetryRule(int retries) {
super();
this.retryCount = new AtomicInteger(retries);
}
@Override
public Statement apply(final Statement base, final FrameworkMethod method, Object target) {
return new Statement() {
@Override
public void evaluate() throws Throwable {
Throwable caughtThrowable = null;
while (retryCount.getAndDecrement() > 0) {
try {
base.evaluate();
return;
} catch (Throwable t) {
if (retryCount.get() > 0 &&
method.getAnnotation(Retry.class) != null) {
caughtThrowable = t;
System.err.println(
method.getName() +
": Failed, " +
retryCount.toString() +
"retries remain");
} else {
throw caughtThrowable;
}
}
}
}
};
}
}
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@AndreSand is there a way to adapt your snippet to work on a per-test basis? (instead of a per-test-class basis)