Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
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;
}
}
@bazi

This comment has been minimized.

Copy link

@bazi bazi commented Mar 31, 2015

hi @fappel
i liked this JUnit rule. i am wondering what is the reasoning of making times method of Repeat annotation abstract? i see no use of it AFAIK.

@rbarbey

This comment has been minimized.

Copy link

@rbarbey rbarbey commented Aug 4, 2015

I'd love to see this in the official JUnit project. What about creating a pull request out of this?

@methylene

This comment has been minimized.

Copy link

@methylene methylene commented Dec 4, 2015

+1

@ghost

This comment has been minimized.

Copy link

@ghost ghost commented Mar 22, 2016

+1

@mbjelac

This comment has been minimized.

Copy link

@mbjelac mbjelac commented Apr 14, 2016

How many times will Before and After methods be called?

@coolersport

This comment has been minimized.

Copy link

@coolersport coolersport commented Aug 29, 2016

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

This comment has been minimized.

Copy link

@cbismuth cbismuth commented Sep 6, 2016

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

This comment has been minimized.

Copy link

@cbismuth cbismuth commented Sep 6, 2016

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