/**
   * 初始化当前测试类用到的spring application context对象
   *
   * @param testedObject
   * @param contextFactory
   * @return does initial spring context successfully
   */
  @SuppressWarnings("rawtypes")
  public static JTesterBeanFactory initSpringContext(
      Class testClazz, ApplicationContextFactory contextFactory) {
    JTesterBeanFactory beanFactory = (JTesterBeanFactory) TestedObject.getSpringBeanFactory();
    if (beanFactory != null) {
      return beanFactory;
    }
    SpringApplicationContext annotation =
        AnnotationUtils.getClassLevelAnnotation(SpringApplicationContext.class, testClazz);
    if (annotation == null) {
      return null;
    }

    long startTime = System.currentTimeMillis();

    String[] locations = annotation.value();
    boolean ignoreNoSuchBean = annotation.ignoreNoSuchBean();
    JTesterSpringContext context =
        contextFactory.createApplicationContext(Arrays.asList(locations), ignoreNoSuchBean);

    context.refresh();
    long duration = System.currentTimeMillis() - startTime;
    JTesterLogger.warn(
        String.format(
            "take %d ms to init spring context for test obejct[%s]",
            duration, testClazz.getName()));

    beanFactory = context.getJTesterBeanFactory();
    TestedObject.setSpringContext(beanFactory);
    return beanFactory;
  }
 /**
  * 释放测试类的spring容器
  *
  * @param springContext AbstractApplicationContext实例,这里定义为Object是方便其它模块脱离spring依赖
  */
 public static void closeSpringContext(Object beanFactory) {
   if (beanFactory == null) {
     return;
   }
   if (beanFactory instanceof JTesterBeanFactory) {
     ((JTesterBeanFactory) beanFactory).destroySingletons();
     JTesterLogger.warn("close spring context for class:" + TestedObject.currTestedClazzName());
   } else {
     String error =
         String.format(
             "there must be something error, the type[%s] object isn't a spring context.",
             beanFactory.getClass().getName());
     throw new RuntimeException(error);
   }
 }