Home | History | Annotate | Download | only in verify
      1 package test.tmp.verify;
      2 
      3 import org.testng.IMethodInstance;
      4 import org.testng.IMethodInterceptor;
      5 import org.testng.ITestContext;
      6 import org.testng.ITestNGMethod;
      7 import org.testng.TestNGUtils;
      8 import org.testng.collections.Maps;
      9 
     10 import java.lang.annotation.Annotation;
     11 import java.lang.reflect.Method;
     12 import java.util.ArrayList;
     13 import java.util.List;
     14 import java.util.Map;
     15 
     16 public class VerifyInterceptor implements IMethodInterceptor {
     17 
     18   /**
     19    * @return the list of methods received in parameters with all methods
     20    * annotated with @Verify inserted after each of these test methods.
     21    *
     22    * This happens in two steps:
     23    * - Find all the methods annotated with @Verify in the classes that contain test methods
     24    * - Insert these verify methods after each method passed in parameter
     25    * These @Verify methods are stored in a map keyed by the class in order to avoid looking them
     26    * up more than once on the same class.
     27    */
     28   @Override
     29   public List<IMethodInstance> intercept(List<IMethodInstance> methods,
     30       ITestContext context) {
     31 
     32     List<IMethodInstance> result = new ArrayList<>();
     33     Map<Class<?>, List<IMethodInstance>> verifyMethods = Maps.newHashMap();
     34     for (IMethodInstance mi : methods) {
     35       ITestNGMethod tm = mi.getMethod();
     36       List<IMethodInstance> verify = verifyMethods.get(tm.getRealClass());
     37       if (verify == null) {
     38         verify = findVerifyMethods(tm.getRealClass(), tm);
     39       }
     40       result.add(mi);
     41       result.addAll(verify);
     42     }
     43 
     44     return result;
     45   }
     46 
     47   /**
     48    * @return all the @Verify methods found on @code{realClass}
     49    */
     50   private List<IMethodInstance> findVerifyMethods(Class realClass, final ITestNGMethod tm) {
     51     List<IMethodInstance> result = new ArrayList<>();
     52     for (final Method m : realClass.getDeclaredMethods()) {
     53       Annotation a = m.getAnnotation(Verify.class);
     54       if (a != null) {
     55         final ITestNGMethod vm = TestNGUtils.createITestNGMethod(tm, m);
     56         result.add(new IMethodInstance() {
     57 
     58           @Override
     59           public Object[] getInstances() {
     60             return tm.getInstances();
     61           }
     62 
     63           @Override
     64           public ITestNGMethod getMethod() {
     65             return vm;
     66           }
     67 
     68           public int compareTo(IMethodInstance o) {
     69             if (getInstances()[0] == o.getInstances()[0]) {
     70               return 0;
     71             } else {
     72               return -1;
     73             }
     74           }
     75 
     76           @Override
     77           public Object getInstance() {
     78             return tm.getInstance();
     79           }
     80         });
     81       }
     82     }
     83 
     84     return result;
     85   }
     86 }
     87