@Override public Injector getInjector(IClass iClass) { Annotation annotation = AnnotationHelper.findAnnotationSuperClasses(Guice.class, iClass.getRealClass()); if (annotation == null) return null; if (iClass instanceof TestClass) { iClass = ((TestClass)iClass).getIClass(); } if (!(iClass instanceof ClassImpl)) return null; Injector parentInjector = ((ClassImpl)iClass).getParentInjector(); Guice guice = (Guice) annotation; List<Module> moduleInstances = Lists.newArrayList(getModules(guice, parentInjector, iClass.getRealClass())); // Reuse the previous injector, if any Injector injector = getInjector(moduleInstances); if (injector == null) { injector = parentInjector.createChildInjector(moduleInstances); addInjector(moduleInstances, injector); } return injector; }
/** Guessing whether or not a class is a test class is an imperfect art form. */ private boolean mightBeATestClass(Class<?> klass) { int klassModifiers = klass.getModifiers(); // Test classes must be public, non-abstract, non-interface if (!Modifier.isPublic(klassModifiers) || Modifier.isInterface(klassModifiers) || Modifier.isAbstract(klassModifiers)) { return false; } // Test classes must either have a public, no-arg constructor, or have a constructor that // initializes using dependency injection, via the org.testng.annotations.Guice annotation on // the class and the com.google.inject.Inject or javax.inject.Inject annotation on the // constructor. boolean foundPublicNoArgConstructor = false; boolean foundInjectedConstructor = false; boolean hasGuiceAnnotation = klass.getAnnotationsByType(Guice.class).length > 0; for (Constructor<?> c : klass.getConstructors()) { if (Modifier.isPublic(c.getModifiers())) { if (c.getParameterCount() == 0) { foundPublicNoArgConstructor = true; } if (hasGuiceAnnotation && (c.getAnnotationsByType(com.google.inject.Inject.class).length > 0 || c.getAnnotationsByType(javax.inject.Inject.class).length > 0)) { foundInjectedConstructor = true; } } } if (!foundPublicNoArgConstructor && !foundInjectedConstructor) { return false; } // Test classes must have at least one public test method (or something that generates tests) boolean hasAtLeastOneTestMethod = false; for (Method m : klass.getMethods()) { if (Modifier.isPublic(m.getModifiers()) && m.getAnnotation(Test.class) != null) { hasAtLeastOneTestMethod = true; } if (Modifier.isPublic(m.getModifiers()) && m.getAnnotation(Factory.class) != null) { hasAtLeastOneTestMethod = true; // technically, not *quite* true, but close enough } } return hasAtLeastOneTestMethod; }