1b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotpackage org.junit.internal.runners; 2b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot 3b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport java.lang.annotation.Annotation; 4b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport java.lang.reflect.Method; 5b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport java.lang.reflect.Modifier; 6b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport java.util.ArrayList; 7b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport java.util.List; 8b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot 9b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport org.junit.After; 10b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport org.junit.AfterClass; 11b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport org.junit.Before; 12b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport org.junit.BeforeClass; 13b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport org.junit.Test; 14b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport org.junit.runners.BlockJUnit4ClassRunner; 15b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot 16b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot/** 17b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * @deprecated Included for backwards compatibility with JUnit 4.4. Will be 18b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * removed in the next release. Please use 19b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * {@link BlockJUnit4ClassRunner} in place of {@link JUnit4ClassRunner}. 20b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot */ 21b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot@Deprecated 22b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotpublic class MethodValidator { 23b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot 24b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot private final List<Throwable> fErrors= new ArrayList<Throwable>(); 25b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot 26b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot private TestClass fTestClass; 27b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot 28b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot public MethodValidator(TestClass testClass) { 29b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot fTestClass = testClass; 30b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot } 31b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot 32b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot public void validateInstanceMethods() { 33b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot validateTestMethods(After.class, false); 34b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot validateTestMethods(Before.class, false); 35b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot validateTestMethods(Test.class, false); 36b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot 37b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot List<Method> methods= fTestClass.getAnnotatedMethods(Test.class); 38b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot if (methods.size() == 0) 39b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot fErrors.add(new Exception("No runnable methods")); 40b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot } 41b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot 42b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot public void validateStaticMethods() { 43b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot validateTestMethods(BeforeClass.class, true); 44b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot validateTestMethods(AfterClass.class, true); 45b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot } 46b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot 47b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot public List<Throwable> validateMethodsForDefaultRunner() { 48b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot validateNoArgConstructor(); 49b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot validateStaticMethods(); 50b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot validateInstanceMethods(); 51b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot return fErrors; 52b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot } 53b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot 54b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot public void assertValid() throws InitializationError { 55b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot if (!fErrors.isEmpty()) 56b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot throw new InitializationError(fErrors); 57b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot } 58b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot 59b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot public void validateNoArgConstructor() { 60b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot try { 61b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot fTestClass.getConstructor(); 62b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot } catch (Exception e) { 63b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot fErrors.add(new Exception("Test class should have public zero-argument constructor", e)); 64b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot } 65b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot } 66b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot 67b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot private void validateTestMethods(Class<? extends Annotation> annotation, 68b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot boolean isStatic) { 69b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot List<Method> methods= fTestClass.getAnnotatedMethods(annotation); 70b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot 71b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot for (Method each : methods) { 72b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot if (Modifier.isStatic(each.getModifiers()) != isStatic) { 73b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot String state= isStatic ? "should" : "should not"; 74b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot fErrors.add(new Exception("Method " + each.getName() + "() " 75b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot + state + " be static")); 76b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot } 77b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot if (!Modifier.isPublic(each.getDeclaringClass().getModifiers())) 78b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot fErrors.add(new Exception("Class " + each.getDeclaringClass().getName() 79b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot + " should be public")); 80b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot if (!Modifier.isPublic(each.getModifiers())) 81b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot fErrors.add(new Exception("Method " + each.getName() 82b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot + " should be public")); 83b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot if (each.getReturnType() != Void.TYPE) 84b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot fErrors.add(new Exception("Method " + each.getName() 85b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot + " should be void")); 86b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot if (each.getParameterTypes().length != 0) 87b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot fErrors.add(new Exception("Method " + each.getName() 88b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot + " should have no parameters")); 89b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot } 90b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot } 91b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot} 92