Skip to content

Instantly share code, notes, and snippets.

@fappel
Last active June 5, 2023 16:58
Show Gist options
  • Select an option

  • Save fappel/8bcb2aea4b39ff9cfb6e to your computer and use it in GitHub Desktop.

Select an option

Save fappel/8bcb2aea4b39ff9cfb6e to your computer and use it in GitHub Desktop.
JUnit 4 TestRule to run a test repeatedly for a specified amount of repititions
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention( RetentionPolicy.RUNTIME )
@Target( {
java.lang.annotation.ElementType.METHOD
} )
public @interface Repeat {
public abstract int times();
}
import org.junit.rules.TestRule;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;
public class RepeatRule implements TestRule {
private static class RepeatStatement extends Statement {
private final int times;
private final Statement statement;
private RepeatStatement( int times, Statement statement ) {
this.times = times;
this.statement = statement;
}
@Override
public void evaluate() throws Throwable {
for( int i = 0; i < times; i++ ) {
statement.evaluate();
}
}
}
@Override
public Statement apply( Statement statement, Description description ) {
Statement result = statement;
Repeat repeat = description.getAnnotation( Repeat.class );
if( repeat != null ) {
int times = repeat.times();
result = new RepeatStatement( times, statement );
}
return result;
}
}
@methylene

Copy link
Copy Markdown

+1

ghost commented Mar 22, 2016

Copy link
Copy Markdown

+1

@mbjelac

mbjelac commented Apr 14, 2016

Copy link
Copy Markdown

How many times will Before and After methods be called?

ghost commented Aug 29, 2016

Copy link
Copy Markdown

Thanks for sharing @fappel. I've documented and tidied it up as well as incorporated @bazi's comment.

See my fork https://gist.github.com/coolersport/b0c26c601c7739d1cbf5f6ded8210bae

@cbismuth

cbismuth commented Sep 6, 2016

Copy link
Copy Markdown

Nice work 👍 thank you @fappel.
It could be interesting to add a random wait option between executions with a default value set to 0 ms.

@cbismuth

cbismuth commented Sep 6, 2016

Copy link
Copy Markdown

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment