Class SpincastJUnitRunner

java.lang.Object
org.junit.runner.Runner
org.junit.runners.ParentRunner<org.junit.runners.model.FrameworkMethod>
org.junit.runners.BlockJUnit4ClassRunner
org.spincast.testing.junitrunner.SpincastJUnitRunner
All Implemented Interfaces:
org.junit.runner.Describable, org.junit.runner.manipulation.Filterable, org.junit.runner.manipulation.Orderable, org.junit.runner.manipulation.Sortable

public class SpincastJUnitRunner extends org.junit.runners.BlockJUnit4ClassRunner
Spincast JUnit Runner.

Only creates one instance of the test class for all its tests.

If the class implements BeforeAfterClassMethodsProvider, then a beforeClass() and afterClass() methods will be called.

You can use the ExpectingBeforeClassException annotation on the test class to indicate that an exception is expected from the beforeClass() method.

If you try to debug a test that only fails sometimes (those are the worst!), you can use the @RepeatUntilFail annotation on the test or on its test class. This allows you to run the test or the whole test class multiple times.

You can also use @RepeatUntilSuccess instead to repeat the test class (or a single test) multiple time until it succeeds (or the maximum number of tries is reached).

  • Field Details

    • logger

      protected static final org.slf4j.Logger logger
    • SPINCAST_TEST_NAME_BEFORE_CLASS_ANNOTATIONS_VALIDATION

      public static final String SPINCAST_TEST_NAME_BEFORE_CLASS_ANNOTATIONS_VALIDATION
    • SPINCAST_TEST_NAME_AFTER_CLASS_ANNOTATIONS_VALIDATION

      public static final String SPINCAST_TEST_NAME_AFTER_CLASS_ANNOTATIONS_VALIDATION
    • SPINCAST_TEST_NAME_BEFORE_CLASS_METHOD_VALIDATION

      public static final String SPINCAST_TEST_NAME_BEFORE_CLASS_METHOD_VALIDATION
      See Also:
    • SPINCAST_TEST_NAME_AFTER_CLASS_METHOD_VALIDATION

      public static final String SPINCAST_TEST_NAME_AFTER_CLASS_METHOD_VALIDATION
      See Also:
    • SPINCAST_TEST_NAME_NO_TESTS_AND_NO_EXPECTION_EXCEPTION_ANNOTATION

      public static final String SPINCAST_TEST_NAME_NO_TESTS_AND_NO_EXPECTION_EXCEPTION_ANNOTATION
    • SPINCAST_TEST_NAME_AFTER_CLASS_LOOPS_EXCEPTION

      public static final String SPINCAST_TEST_NAME_AFTER_CLASS_LOOPS_EXCEPTION
      See Also:
    • SPINCAST_TEST_NAME_REPEAT_ANNOTATIONS_VALIDATION

      public static final String SPINCAST_TEST_NAME_REPEAT_ANNOTATIONS_VALIDATION
    • SPINCAST_TEST_NAME_EXPECTING_FAILURE_BUT_ONLY_SUCCESSES

      public static final String SPINCAST_TEST_NAME_EXPECTING_FAILURE_BUT_ONLY_SUCCESSES
  • Constructor Details

    • SpincastJUnitRunner

      public SpincastJUnitRunner(Class<?> clazz) throws org.junit.runners.model.InitializationError
      Throws:
      org.junit.runners.model.InitializationError
  • Method Details

    • getRunNotifier

      protected org.junit.runner.notification.RunNotifier getRunNotifier()
    • setIgnoreRemainingTests

      protected void setIgnoreRemainingTests()
    • isIgnoreRemainingTests

      protected boolean isIgnoreRemainingTests()
    • setExceptionInBeforeClass

      protected void setExceptionInBeforeClass()
    • isExceptionInBeforeClass

      protected boolean isExceptionInBeforeClass()
    • getCurrentClassLoopPosition

      protected int getCurrentClassLoopPosition()
    • createTest

      public Object createTest() throws Exception
      JUnit calls that method to create an instance of the test class for each individual test. We change this behavior and always return the *same* instance of the test class: 'testClassInstance'.
      Overrides:
      createTest in class org.junit.runners.BlockJUnit4ClassRunner
      Throws:
      Exception
    • getTestClassInstance

      protected Object getTestClassInstance()
    • getName

      protected String getName()
      Test class display name.
      Overrides:
      getName in class org.junit.runners.ParentRunner<org.junit.runners.model.FrameworkMethod>
    • computeTestMethods

      protected final List<org.junit.runners.model.FrameworkMethod> computeTestMethods()
      Overrides:
      computeTestMethods in class org.junit.runners.BlockJUnit4ClassRunner
    • run

      public void run(org.junit.runner.notification.RunNotifier notifier)
      Runs the test class.
      Overrides:
      run in class org.junit.runners.ParentRunner<org.junit.runners.model.FrameworkMethod>
    • runChild

      protected void runChild(org.junit.runners.model.FrameworkMethod method, org.junit.runner.notification.RunNotifier notifier)
      Runs a specific test
      Overrides:
      runChild in class org.junit.runners.BlockJUnit4ClassRunner
    • methodBlock

      protected org.junit.runners.model.Statement methodBlock(org.junit.runners.model.FrameworkMethod method)
      Overrides:
      methodBlock in class org.junit.runners.BlockJUnit4ClassRunner
    • customizeStatement

      protected org.junit.runners.model.Statement customizeStatement(org.junit.runners.model.Statement statement, org.junit.runners.model.FrameworkMethod method)
    • addCustomErrorHandling

      protected org.junit.runners.model.Statement addCustomErrorHandling(org.junit.runners.model.Statement baseStatement, org.junit.runners.model.FrameworkMethod method)
    • addTestFailureListener

      protected void addTestFailureListener(org.junit.runner.notification.RunNotifier notifier)
    • testFailureCustomHandling

      protected void testFailureCustomHandling(org.junit.runner.notification.Failure failure)
    • logTestFailure

      protected void logTestFailure(org.junit.runner.notification.Failure failure)
    • isLastInstanceOfThisTestToRun

      protected boolean isLastInstanceOfThisTestToRun()
    • runPreClassLoopsSpincastTests

      protected void runPreClassLoopsSpincastTests()
    • validateNoBeforeClassAnnotations

      protected void validateNoBeforeClassAnnotations()
    • validateNoAfterClassAnnotations

      protected void validateNoAfterClassAnnotations()
    • validateNoTestsAndNoExpectingBeforeClassExceptionAnnotation

      protected void validateNoTestsAndNoExpectingBeforeClassExceptionAnnotation()
    • validateTestClassRepeateAnnotations

      protected void validateTestClassRepeateAnnotations()
    • spincastTestError

      protected void spincastTestError(String testName, String errorMessage)
    • spincastTestError

      protected void spincastTestError(String testName, Throwable exception)
    • getStackTrace

      protected String getStackTrace(Throwable ex)
    • isExpectingBeforeClassException

      public boolean isExpectingBeforeClassException()
    • isExpectingFailure

      public boolean isExpectingFailure()
    • getTestClassRepeatUntilFailureAnnotationLoopsNbr

      protected Integer getTestClassRepeatUntilFailureAnnotationLoopsNbr()
      Will be null if there if no RepeatUntilFailure annotation.
    • getMethodRepeatUntilFailureAnnotationLoopsNbr

      protected Integer getMethodRepeatUntilFailureAnnotationLoopsNbr(Method method)
      Will be null if there if no RepeatUntilFailure annotation.
    • geRepeatUntilFailureAnnotationLoopsNbr

      protected Integer geRepeatUntilFailureAnnotationLoopsNbr(RepeatUntilFailure repeatUntilFailureAnnotation)
      Will be null if there if no RepeatUntilFailure annotation.
    • getTestClassRepeatUntilFailureAnnotationLoopsSleep

      protected Integer getTestClassRepeatUntilFailureAnnotationLoopsSleep()
      Will be null if there if no RepeatUntilFailure annotation.
    • getMethodRepeatUntilFailureAnnotationLoopsSleep

      protected Integer getMethodRepeatUntilFailureAnnotationLoopsSleep(Method method)
      Will be null if there if no RepeatUntilFailure annotation.
    • getRepeatUntilFailureAnnotationLoopsSleep

      protected Integer getRepeatUntilFailureAnnotationLoopsSleep(RepeatUntilFailure repeatAnnotation)
      Will be null if there if no RepeatUntilFailure annotation.
    • getTestClassRepeatUntilSuccessAnnotationLoopsNbr

      protected Integer getTestClassRepeatUntilSuccessAnnotationLoopsNbr()
      Will be null if there if no RepeatUntilSuccess annotation.
    • getMethodRepeatUntilSuccessAnnotationLoopsNbr

      protected Integer getMethodRepeatUntilSuccessAnnotationLoopsNbr(Method method)
      Will be null if there if no RepeatUntilSuccess annotation.
    • geRepeatUntilSuccessAnnotationLoopsNbr

      protected Integer geRepeatUntilSuccessAnnotationLoopsNbr(RepeatUntilSuccess repeatUntilSuccessAnnotation)
      Will be null if there if no RepeatUntilSuccess annotation.
    • getTestClassRepeatUntilSuccessAnnotationLoopsSleep

      protected Integer getTestClassRepeatUntilSuccessAnnotationLoopsSleep()
      Will be null if there if no RepeatUntilSuccess annotation.
    • getMethodRepeatUntilSuccessAnnotationLoopsSleep

      protected Integer getMethodRepeatUntilSuccessAnnotationLoopsSleep(Method method)
      Will be null if there if no RepeatUntilSuccess annotation.
    • getRepeatUntilSuccessAnnotationLoopsSleep

      protected Integer getRepeatUntilSuccessAnnotationLoopsSleep(RepeatUntilSuccess repeatUntilSuccessAnnotation)
      Will be null if there if no RepeatUntilSuccess annotation.