package de.vksi.c4j.outsidesystemtest; import static org.junit.Assert.fail; import java.util.List; import javassist.CtClass; import javassist.CtField; import javassist.CtMethod; import javassist.Modifier; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TestRule; import de.vksi.c4j.internal.contracts.ClasspathScanner; import de.vksi.c4j.systemtest.TransformerAwareRule; public class RuleEnforcingTestBase { private final Class<? extends TestRule> ruleClass = TransformerAwareRule.class; public void enforceRuleInPackage(String packageName) throws Exception { List<CtClass> classes = new ClasspathScanner(packageName, true, Thread.currentThread().getContextClassLoader()) .getAllClasses(); for (CtClass clazz : classes) { handleClassFileInPackage(clazz); } } private void handleClassFileInPackage(CtClass clazz) throws Exception { if (!containsTestMethods(clazz)) { return; } for (CtField field : clazz.getFields()) { if (field.hasAnnotation(Rule.class) && field.getType().getName().equals(ruleClass.getName()) && Modifier.isPublic(field.getModifiers())) { return; } } fail("Mandatory Rule " + ruleClass + " was not found in test-class " + clazz.getName() + "."); } private boolean containsTestMethods(CtClass clazz) { for (CtMethod method : clazz.getDeclaredMethods()) { if (method.hasAnnotation(Test.class)) { return true; } } return false; } }