java.lang.IllegalStateException: Failed to find 'public static final SpringClassRule' field in test class [com.example.unit.testing.application.PlacingOrderTest$WithExistingCustomer]. Consult the javadoc for SpringClassRule for details.

Spring JIRA | Benoit AVERTY | 10 months ago
tip
Click on the to mark the solution that helps you, Samebug will learn from it.
As a community member, you’ll be rewarded for you help.
  1. 0

    When using the {{@Rule}} and {{@ClassRule}} classes SpringTestRule and SpringMethodRule in conjunction with a custom Runner that allows to use nested classes to create hierarchical tests, the tests in subclasses fail with a {{IllegalStateException}}. Example of a hierarchical runner : - https://github.com/bechte/junit-hierarchicalcontextrunner/wiki - https://github.com/NitorCreations/CoreComponents/tree/master/junit-runners The second one doesn't have the same error but i'm guessing the problem is similar. StackTrace : {noformat} java.lang.IllegalStateException: Failed to find 'public static final SpringClassRule' field in test class [com.example.unit.testing.application.PlacingOrderTest$WithExistingCustomer]. Consult the javadoc for SpringClassRule for details. at org.springframework.test.context.junit4.rules.SpringMethodRule.validateSpringClassRuleConfiguration(SpringMethodRule.java:233) at org.springframework.test.context.junit4.rules.SpringMethodRule.apply(SpringMethodRule.java:143) at de.bechte.junit.runners.context.statements.builder.HierarchicalRunRulesStatementBuilder.createStatement(HierarchicalRunRulesStatementBuilder.java:42) at de.bechte.junit.runners.context.processing.MethodExecutor.run(MethodExecutor.java:80) at de.bechte.junit.runners.context.processing.MethodExecutor.run(MethodExecutor.java:57) at de.bechte.junit.runners.context.statements.RunChildren.evaluate(RunChildren.java:38) at de.bechte.junit.runners.context.statements.RunAll.evaluate(RunAll.java:27) at de.bechte.junit.runners.context.statements.StatementExecutor.execute(StatementExecutor.java:28) at de.bechte.junit.runners.context.HierarchicalContextRunner.run(HierarchicalContextRunner.java:134) at de.bechte.junit.runners.context.processing.ContextExecutor.run(ContextExecutor.java:26) at de.bechte.junit.runners.context.processing.ContextExecutor.run(ContextExecutor.java:15) at de.bechte.junit.runners.context.statements.RunChildren.evaluate(RunChildren.java:38) at de.bechte.junit.runners.context.statements.RunAll.evaluate(RunAll.java:27) at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) at org.springframework.test.context.junit4.statements.ProfileValueChecker.evaluate(ProfileValueChecker.java:103) at org.springframework.test.context.junit4.rules.SpringClassRule$TestContextManagerCacheEvictor.evaluate(SpringClassRule.java:248) at org.junit.rules.RunRules.evaluate(RunRules.java:20) at de.bechte.junit.runners.context.statements.StatementExecutor.execute(StatementExecutor.java:28) at de.bechte.junit.runners.context.HierarchicalContextRunner.run(HierarchicalContextRunner.java:134) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) {noformat} The exception makes sense because the nested class indeed doesn't have the static SpringClassRule. But it can't have it because the nested class isn't static. Moreover, I'm not sure it would need it because the rule would be evaluated twice. Is it possible to correct this behavior or find a workaround ?

    Spring JIRA | 10 months ago | Benoit AVERTY
    java.lang.IllegalStateException: Failed to find 'public static final SpringClassRule' field in test class [com.example.unit.testing.application.PlacingOrderTest$WithExistingCustomer]. Consult the javadoc for SpringClassRule for details.
  2. 0

    h4. Status Quo The _Spring TestContext Framework_ has traditionally supported only top-level or static nested test classes. With support for {{@Nested}} test classes in JUnit 5 and custom runners in JUnit 4, however, there is increased need to support nested non-static test classes (i.e., _inner_ classes). h4. Deliverables # (/) Introduce support for loading a test {{ApplicationContext}} via {{@ContextConfiguration}} and related annotations for a _nested_ test class. #- This already works without modifications to the existing code base: a _nested_ (i.e., non-static _inner_) test class is still a {{Class}}, so the TestContext framework doesn't need to do anything special here. # (/) Ensure that JUnit Jupiter based {{@Nested}} test classes work with the TestContext framework. #- This already works for the same reasons mentioned for deliverable #1. # (/) Ensure that {{SpringClassRule}} and {{SpringMethodRule}} work in conjunction with JUnit 4 based runners that support _nested_ test classes. #- Introduced a workaround which is documented in this issue's comments section. h4. JUnit 4 Hierarchical Runners When using the {{@Rule}} and {{@ClassRule}} classes {{SpringMethodRule}} and {{SpringClassRule}} in conjunction with a custom JUnit 4 {{Runner}} that allows one to use nested classes to create hierarchical tests, the tests in subclasses fail with an {{IllegalStateException}}. Examples of hierarchical runners: - https://github.com/bechte/junit-hierarchicalcontextrunner/wiki - https://github.com/NitorCreations/CoreComponents/tree/master/junit-runners The second one doesn't have the same error, but I'm guessing the problem is similar. {noformat:title=Stack Trace} java.lang.IllegalStateException: Failed to find 'public static final SpringClassRule' field in test class [com.example.unit.testing.application.PlacingOrderTest$WithExistingCustomer]. Consult the javadoc for SpringClassRule for details. at org.springframework.test.context.junit4.rules.SpringMethodRule.validateSpringClassRuleConfiguration(SpringMethodRule.java:233) at org.springframework.test.context.junit4.rules.SpringMethodRule.apply(SpringMethodRule.java:143) at de.bechte.junit.runners.context.statements.builder.HierarchicalRunRulesStatementBuilder.createStatement(HierarchicalRunRulesStatementBuilder.java:42) at de.bechte.junit.runners.context.processing.MethodExecutor.run(MethodExecutor.java:80) at de.bechte.junit.runners.context.processing.MethodExecutor.run(MethodExecutor.java:57) at de.bechte.junit.runners.context.statements.RunChildren.evaluate(RunChildren.java:38) at de.bechte.junit.runners.context.statements.RunAll.evaluate(RunAll.java:27) at de.bechte.junit.runners.context.statements.StatementExecutor.execute(StatementExecutor.java:28) at de.bechte.junit.runners.context.HierarchicalContextRunner.run(HierarchicalContextRunner.java:134) at de.bechte.junit.runners.context.processing.ContextExecutor.run(ContextExecutor.java:26) at de.bechte.junit.runners.context.processing.ContextExecutor.run(ContextExecutor.java:15) at de.bechte.junit.runners.context.statements.RunChildren.evaluate(RunChildren.java:38) at de.bechte.junit.runners.context.statements.RunAll.evaluate(RunAll.java:27) at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) at org.springframework.test.context.junit4.statements.ProfileValueChecker.evaluate(ProfileValueChecker.java:103) at org.springframework.test.context.junit4.rules.SpringClassRule$TestContextManagerCacheEvictor.evaluate(SpringClassRule.java:248) at org.junit.rules.RunRules.evaluate(RunRules.java:20) at de.bechte.junit.runners.context.statements.StatementExecutor.execute(StatementExecutor.java:28) at de.bechte.junit.runners.context.HierarchicalContextRunner.run(HierarchicalContextRunner.java:134) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) {noformat} The exception makes sense because the nested class indeed doesn't have the static {{SpringClassRule}}. But it can't have it because the nested class isn't static. Moreover, I'm not sure it would need it because the rule would be evaluated twice.

    Spring JIRA | 10 months ago | Benoit AVERTY
    java.lang.IllegalStateException: Failed to find 'public static final SpringClassRule' field in test class [com.example.unit.testing.application.PlacingOrderTest$WithExistingCustomer]. Consult the javadoc for SpringClassRule for details.

    Root Cause Analysis

    1. java.lang.IllegalStateException

      Failed to find 'public static final SpringClassRule' field in test class [com.example.unit.testing.application.PlacingOrderTest$WithExistingCustomer]. Consult the javadoc for SpringClassRule for details.

      at org.springframework.test.context.junit4.rules.SpringMethodRule.validateSpringClassRuleConfiguration()
    2. org.springframework.test
      SpringMethodRule.apply
      1. org.springframework.test.context.junit4.rules.SpringMethodRule.validateSpringClassRuleConfiguration(SpringMethodRule.java:233)
      2. org.springframework.test.context.junit4.rules.SpringMethodRule.apply(SpringMethodRule.java:143)
      2 frames
    3. de.bechte.junit
      RunAll.evaluate
      1. de.bechte.junit.runners.context.statements.builder.HierarchicalRunRulesStatementBuilder.createStatement(HierarchicalRunRulesStatementBuilder.java:42)
      2. de.bechte.junit.runners.context.processing.MethodExecutor.run(MethodExecutor.java:80)
      3. de.bechte.junit.runners.context.processing.MethodExecutor.run(MethodExecutor.java:57)
      4. de.bechte.junit.runners.context.statements.RunChildren.evaluate(RunChildren.java:38)
      5. de.bechte.junit.runners.context.statements.RunAll.evaluate(RunAll.java:27)
      6. de.bechte.junit.runners.context.statements.StatementExecutor.execute(StatementExecutor.java:28)
      7. de.bechte.junit.runners.context.HierarchicalContextRunner.run(HierarchicalContextRunner.java:134)
      8. de.bechte.junit.runners.context.processing.ContextExecutor.run(ContextExecutor.java:26)
      9. de.bechte.junit.runners.context.processing.ContextExecutor.run(ContextExecutor.java:15)
      10. de.bechte.junit.runners.context.statements.RunChildren.evaluate(RunChildren.java:38)
      11. de.bechte.junit.runners.context.statements.RunAll.evaluate(RunAll.java:27)
      11 frames
    4. Spring TestContext
      ProfileValueChecker.evaluate
      1. org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
      2. org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
      3. org.springframework.test.context.junit4.statements.ProfileValueChecker.evaluate(ProfileValueChecker.java:103)
      3 frames
    5. org.springframework.test
      SpringClassRule$TestContextManagerCacheEvictor.evaluate
      1. org.springframework.test.context.junit4.rules.SpringClassRule$TestContextManagerCacheEvictor.evaluate(SpringClassRule.java:248)
      1 frame
    6. JUnit
      RunRules.evaluate
      1. org.junit.rules.RunRules.evaluate(RunRules.java:20)
      1 frame
    7. de.bechte.junit
      HierarchicalContextRunner.run
      1. de.bechte.junit.runners.context.statements.StatementExecutor.execute(StatementExecutor.java:28)
      2. de.bechte.junit.runners.context.HierarchicalContextRunner.run(HierarchicalContextRunner.java:134)
      2 frames
    8. JUnit4 Runner
      JUnit4TestReference.run
      1. org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
      1 frame
    9. JUnit3 Runner
      RemoteTestRunner.main
      1. org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
      2. org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
      3. org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
      4. org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
      5. org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
      5 frames