org.junit.internal.runners.rules.RuleFieldValidator Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of junit Show documentation
Show all versions of junit Show documentation
JUnit is a regression testing framework written by Erich Gamma and Kent Beck.
It is used by the developer who implements unit tests in Java.
package org.junit.internal.runners.rules;
import java.lang.annotation.Annotation;
import java.util.List;
import org.junit.ClassRule;
import org.junit.Rule;
import org.junit.rules.MethodRule;
import org.junit.rules.TestRule;
import org.junit.runners.model.FrameworkMember;
import org.junit.runners.model.TestClass;
/**
* A RuleFieldValidator validates the rule fields of a
* {@link org.junit.runners.model.TestClass}. All reasons for rejecting the
* {@code TestClass} are written to a list of errors.
*
* There are four slightly different validators. The {@link #CLASS_RULE_VALIDATOR}
* validates fields with a {@link ClassRule} annotation and the
* {@link #RULE_VALIDATOR} validates fields with a {@link Rule} annotation.
*
* The {@link #CLASS_RULE_METHOD_VALIDATOR}
* validates methods with a {@link ClassRule} annotation and the
* {@link #RULE_METHOD_VALIDATOR} validates methods with a {@link Rule} annotation.
*/
public enum RuleFieldValidator {
/**
* Validates fields with a {@link ClassRule} annotation.
*/
CLASS_RULE_VALIDATOR(ClassRule.class, false, true),
/**
* Validates fields with a {@link Rule} annotation.
*/
RULE_VALIDATOR(Rule.class, false, false),
/**
* Validates methods with a {@link ClassRule} annotation.
*/
CLASS_RULE_METHOD_VALIDATOR(ClassRule.class, true, true),
/**
* Validates methods with a {@link Rule} annotation.
*/
RULE_METHOD_VALIDATOR(Rule.class, true, false);
private final Class fAnnotation;
private final boolean fStaticMembers;
private final boolean fMethods;
private RuleFieldValidator(Class annotation,
boolean methods, boolean fStaticMembers) {
this.fAnnotation = annotation;
this.fStaticMembers = fStaticMembers;
this.fMethods = methods;
}
/**
* Validate the {@link org.junit.runners.model.TestClass} and adds reasons
* for rejecting the class to a list of errors.
*
* @param target the {@code TestClass} to validate.
* @param errors the list of errors.
*/
public void validate(TestClass target, List errors) {
List> members = fMethods ? target.getAnnotatedMethods(fAnnotation)
: target.getAnnotatedFields(fAnnotation);
for (FrameworkMember each : members) {
validateMember(each, errors);
}
}
private void validateMember(FrameworkMember member, List errors) {
validateStatic(member, errors);
validatePublic(member, errors);
validateTestRuleOrMethodRule(member, errors);
}
private void validateStatic(FrameworkMember member,
List errors) {
if (fStaticMembers && !member.isStatic()) {
addError(errors, member, "must be static.");
}
if (!fStaticMembers && member.isStatic()) {
addError(errors, member, "must not be static.");
}
}
private void validatePublic(FrameworkMember member, List errors) {
if (!member.isPublic()) {
addError(errors, member, "must be public.");
}
}
private void validateTestRuleOrMethodRule(FrameworkMember member,
List errors) {
if (!isMethodRule(member) && !isTestRule(member)) {
addError(errors, member, fMethods ?
"must return an implementation of MethodRule or TestRule." :
"must implement MethodRule or TestRule.");
}
}
private boolean isTestRule(FrameworkMember member) {
return TestRule.class.isAssignableFrom(member.getType());
}
@SuppressWarnings("deprecation")
private boolean isMethodRule(FrameworkMember member) {
return MethodRule.class.isAssignableFrom(member.getType());
}
private void addError(List errors, FrameworkMember member,
String suffix) {
String message = "The @" + fAnnotation.getSimpleName() + " '"
+ member.getName() + "' " + suffix;
errors.add(new Exception(message));
}
}