private void executeTestMethod(FrameworkMethod it, Object target, Object... parameters)
      throws Throwable {
    SavePoint savePoint = new SavePoint();
    TestRun.setSavePointForTestMethod(savePoint);

    Method testMethod = it.getMethod();
    Throwable testFailure = null;
    boolean testFailureExpected = false;

    try {
      Object[] mockParameters = null;
      /** modified by davey.wu * */
      String frameworkMethodName = it.getClass().getName();
      /** 不判断整个类名,是尽量避免代码package重构带来的影响 * */
      boolean isTest4JFrameworkMethod =
          frameworkMethodName.startsWith("org.test4j.junit.")
              && frameworkMethodName.endsWith(".FrameworkMethodWithParameters");
      if (!isTest4JFrameworkMethod) {
        mockParameters =
            createInstancesForMockParameters(target, testMethod, parameters, savePoint);
      }
      /** end modified by davey.wu * */
      createInstancesForTestedFields(target);

      TestRun.setRunningIndividualTest(target);
      it.invokeExplosively(target, mockParameters == null ? parameters : mockParameters);
    } catch (Throwable thrownByTest) {
      testFailure = thrownByTest;
      Class<? extends Throwable> expectedType = testMethod.getAnnotation(Test.class).expected();
      testFailureExpected = expectedType.isAssignableFrom(thrownByTest.getClass());
    } finally {
      concludeTestMethodExecution(savePoint, testFailure, testFailureExpected);
    }
  }
  Object invokeExplosively(FrameworkMethod it, Object target, Object... params) throws Throwable {
    Method method = it.getMethod();
    Class<?> testClass = target == null ? method.getDeclaringClass() : target.getClass();

    handleMockingOutsideTestMethods(it, target, testClass);

    // In case it isn't a test method, but a before/after method:
    if (it.getAnnotation(Test.class) == null) {
      if (shouldPrepareForNextTest && it.getAnnotation(Before.class) != null) {
        prepareForNextTest();
        shouldPrepareForNextTest = false;
      }

      TestRun.setRunningIndividualTest(target);
      TestRun.setSavePointForTestMethod(null);

      try {
        return it.invokeExplosively(target, params);
      } catch (Throwable t) {
        RecordAndReplayExecution.endCurrentReplayIfAny();
        StackTrace.filterStackTrace(t);
        throw t;
      } finally {
        if (it.getAnnotation(After.class) != null) {
          shouldPrepareForNextTest = true;
        }
      }
    }

    if (shouldPrepareForNextTest) {
      prepareForNextTest();
    }

    shouldPrepareForNextTest = true;

    try {
      executeTestMethod(it, target, params);
      return null; // it's a test method, therefore has void return type
    } catch (Throwable t) {
      StackTrace.filterStackTrace(t);
      throw t;
    } finally {
      /** modified by davey.wu * */
      TestRun.finishCurrentTestExecution(true);
      // TestRun.finishCurrentTestExecution(false);
      /** end modified by davey.wu * */
    }
  }