package test;
import org.testng.Assert;
import org.testng.annotations.Test;
import org.testng.collections.Lists;
import org.testng.internal.reflect.ReflectionHelper;
import test.github765.DuplicateCallsSample;
import java.lang.reflect.Method;
import java.util.List;
public class ReflectionHelperTest {
@Test
public void testMethodCount() {
//Testing exclusion of synthetic methods Refer http://stackoverflow.com/a/5007394 to learn more
Method[] methods = prune(ReflectionHelper.getLocalMethods(DuplicateCallsSample.class));
Assert.assertEquals(methods.length, 2);
//Testing a straight forward use case of retrieving concrete methods
methods = prune(ReflectionHelper.getLocalMethods(Dog.class));
Assert.assertEquals(methods.length, 1);
//When class has no methods count should be zero.
methods = prune(ReflectionHelper.getLocalMethods(Dinosaur.class));
Assert.assertEquals(methods.length, 0);
//Abstract methods should be included.
methods = prune(ReflectionHelper.getLocalMethods(Dragon.class));
Assert.assertEquals(methods.length, 2);
}
/**
* @param methods - The list of methods extracted from a Class
* @return - A {@link Method} array which excludes a special method named
* "jacocoInit" which is getting injected into the test class only when the test
* is executed via Gradle.
*/
private static Method[] prune(Method[] methods) {
List<Method> pruned = Lists.newArrayList(methods.length);
for (Method method : methods) {
if (! method.getName().contains("jacocoInit")) {
pruned.add(method);
}
}
return pruned.toArray(new Method[pruned.size()]);
}
interface Animal {
void makeSound();
}
class Dog implements Animal {
@Override
public void makeSound() {
}
}
abstract class Dinosaur implements Animal {}
abstract class Dragon implements Animal {
@Override
public void makeSound() {
}
abstract void walk();
}
}