使用代码方式运行指定单元测试类及方法

记一下, 备忘

private void runTest(String className, String... methodNames) throws Exception {
assert StringUtils.isNotBlank(className);
Class<?> testClass = Class.forName(className);
Runner runner = getRunner(testClass);
if (runner instanceof Suite) {
SuiteClasses ann = testClass.getAnnotation(Suite.SuiteClasses.class);
Class<?>[] testClasses = ann.value();
for (Class<?> clazz : testClasses) {
run(clazz, getRunner(clazz), methodNames);
}
} else {
run(testClass, runner, methodNames);
}
}

private Runner getRunner(Class<?> testClass) {
Request request = Request.aClass(testClass);
Runner runner = request.getRunner();
return runner;
}

private void run(Class<?> testClass, Runner runner, String... methodNames) throws NoSuchMethodException,
NoSuchFieldException, IllegalAccessException {
if (runner instanceof IgnoredClassRunner)
return;

JUnit4ClassRunner j4Runner = (JUnit4ClassRunner) runner;
Class<?> runnerClass = j4Runner.getClass();
while (runnerClass != JUnit4ClassRunner.class) {
runnerClass = runnerClass.getSuperclass();
if (runnerClass == Object.class) {
break;
}
}
if (methodNames != null && methodNames.length != 0) {
String fielName = "fTestMethods";
Field fTestMethods = runnerClass.getDeclaredField(fielName);
if (fTestMethods == null) {
throw new RuntimeException(String.format("the runner class[%s]'s field[%s] is not existed!",
runnerClass,
fielName));
}
List<Method> methods = new ArrayList<Method>(methodNames.length);
for (String methodName : methodNames) {
if (StringUtils.isBlank(methodName))
continue;

Method testMethod = testClass.getDeclaredMethod(methodName);
methods.add(testMethod);
}
fTestMethods.setAccessible(true);
fTestMethods.set(j4Runner, methods);
}
JUnitCore core = new JUnitCore();
core.addListener(getRunListener());
core.run(runner);
}

private RunListener getRunListener() {
return new RunListener() {
@Override
public void testRunStarted(Description description) throws Exception {
logger.debug("开始测试类" + description.getDisplayName());
}

@Override
public void testRunFinished(Result result) throws Exception {
logger.debug("测试结束" + "\n");
}

@Override
public void testStarted(Description description) throws Exception {
logger.debug("\t开始测试方法:" + description.getDisplayName());
}

@Override
public void testFinished(Description description) throws Exception {
logger.debug("\t结束测试方法");
}

@Override
public void testFailure(Failure failure) throws Exception {
Throwable exception = failure.getException();
logger.error("", exception);
}
};
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值