@Override
      public void evaluate() throws Throwable {
        try {
          base.evaluate();
        } catch (final Throwable e) {
          // Pay attention to the situation of MultipleFailureException...
          if ((e instanceof MultipleFailureException
                  && ((MultipleFailureException) e)
                      .getFailures().stream().allMatch(this::isExceptionInSetUpOrTearDown))
              || isExceptionInSetUpOrTearDown(e)) {
            Assume.assumeTrue(
                String.format(
                    "Skipping test due to setup or tearDown failure for %s#%s",
                    description.getClassName(), description.getMethodName()),
                false);
          }

          // Re-throw the exception (which means the test has failed).
          throw e;

          // Regardless of the circumstances, the method decorated with @After will always be
          // executed.
        }
      }
@param setUpMethodName Should be exactly the same as the method name decorated with @Before.
@param tearDownMethodName Should be exactly the same as the method name decorated with @After.
integration-test/src/test/java/org/apache/iotdb/subscription/it/SkipOnSetUpAndTearDownFailure.java