Introduce SpringRunner 'alias' for SpringJUnit4ClassRunner
This commit introduces a SpringRunner extension of
SpringJUnit4ClassRunner that is intended to be used as an 'alias' for
SpringJUnit4ClassRunner, primarily in order to simplify configuration
of JUnit 4 based integration tests.
Developers can use this alias as follows:
@RunWith(SpringRunner.class)
public class MySpringIntegrationTests { ... }
Issue: SPR-13954
@ -1192,11 +1191,11 @@ configuration of individual test classes as follows:
@@ -1192,11 +1191,11 @@ configuration of individual test classes as follows:
[source,java,indent=0]
[subs="verbatim,quotes"]
----
@RunWith(SpringJUnit4ClassRunner.class)
@RunWith(SpringRunner.class)
@TransactionalDevTest
public class OrderRepositoryTests { }
@RunWith(SpringJUnit4ClassRunner.class)
@RunWith(SpringRunner.class)
@TransactionalDevTest
public class UserRepositoryTests { }
----
@ -1453,7 +1452,7 @@ on either a field or setter method. For example:
@@ -1453,7 +1452,7 @@ on either a field or setter method. For example:
[source,java,indent=0]
[subs="verbatim,quotes"]
----
@RunWith(SpringJUnit4ClassRunner.class)
@RunWith(SpringRunner.class)
@ContextConfiguration
public class MyTest {
@ -1470,7 +1469,7 @@ the web application context into your test as follows:
@@ -1470,7 +1469,7 @@ the web application context into your test as follows:
[source,java,indent=0]
[subs="verbatim,quotes"]
----
@RunWith(SpringJUnit4ClassRunner.class)
@RunWith(SpringRunner.class)
**@WebAppConfiguration**
@ContextConfiguration
public class MyWebAppTest {
@ -1515,7 +1514,7 @@ prefixed with `classpath:`, `file:`, `http:`, etc.) will be used __as is__.
@@ -1515,7 +1514,7 @@ prefixed with `classpath:`, `file:`, `http:`, etc.) will be used __as is__.
[source,java,indent=0]
[subs="verbatim,quotes"]
----
@RunWith(SpringJUnit4ClassRunner.class)
@RunWith(SpringRunner.class)
// ApplicationContext will be loaded from "/app-config.xml" and
// "/test-config.xml" in the root of the classpath
@ -1552,7 +1551,7 @@ a default location based on the name of the test class. If your class is named
@@ -1552,7 +1551,7 @@ a default location based on the name of the test class. If your class is named
----
package com.example;
@RunWith(SpringJUnit4ClassRunner.class)
@RunWith(SpringRunner.class)
// ApplicationContext will be loaded from
// "classpath:com/example/MyTest-context.xml"
**@ContextConfiguration**
@ -1582,7 +1581,7 @@ TestContext Framework is enabled automatically if Groovy is on the classpath.
@@ -1582,7 +1581,7 @@ TestContext Framework is enabled automatically if Groovy is on the classpath.
[source,java,indent=0]
[subs="verbatim,quotes"]
----
@RunWith(SpringJUnit4ClassRunner.class)
@RunWith(SpringRunner.class)
// ApplicationContext will be loaded from "/AppConfig.groovy" and
// "/TestConfig.groovy" in the root of the classpath
@ -1603,7 +1602,7 @@ detect a default location based on the name of the test class. If your class is
@@ -1603,7 +1602,7 @@ detect a default location based on the name of the test class. If your class is
----
package com.example;
@RunWith(SpringJUnit4ClassRunner.class)
@RunWith(SpringRunner.class)
// ApplicationContext will be loaded from
// "classpath:com/example/MyTestContext.groovy"
**@ContextConfiguration**
@ -1625,7 +1624,7 @@ The following listing demonstrates how to combine both in an integration test.
@@ -1625,7 +1624,7 @@ The following listing demonstrates how to combine both in an integration test.
@ -1645,7 +1644,7 @@ To load an `ApplicationContext` for your tests using __annotated classes__ (see
@@ -1645,7 +1644,7 @@ To load an `ApplicationContext` for your tests using __annotated classes__ (see
[source,java,indent=0]
[subs="verbatim,quotes"]
----
@RunWith(SpringJUnit4ClassRunner.class)
@RunWith(SpringRunner.class)
// ApplicationContext will be loaded from AppConfig and TestConfig
@ -1682,7 +1681,7 @@ configuration class is arbitrary. In addition, a test class can contain more tha
@@ -1682,7 +1681,7 @@ configuration class is arbitrary. In addition, a test class can contain more tha
[source,java,indent=0]
[subs="verbatim,quotes"]
----
@RunWith(SpringJUnit4ClassRunner.class)
@RunWith(SpringRunner.class)
// ApplicationContext will be loaded from the
// static nested Config class
**@ContextConfiguration**
@ -1761,7 +1760,7 @@ standard `@Priority` annotation.
@@ -1761,7 +1760,7 @@ standard `@Priority` annotation.
[source,java,indent=0]
[subs="verbatim,quotes"]
----
@RunWith(SpringJUnit4ClassRunner.class)
@RunWith(SpringRunner.class)
// ApplicationContext will be loaded from TestConfig
// and initialized by TestAppCtxInitializer
**@ContextConfiguration(
@ -1781,7 +1780,7 @@ files or configuration classes.
@@ -1781,7 +1780,7 @@ files or configuration classes.
[source,java,indent=0]
[subs="verbatim,quotes"]
----
@RunWith(SpringJUnit4ClassRunner.class)
@RunWith(SpringRunner.class)
// ApplicationContext will be initialized by EntireAppInitializer
// which presumably registers beans in the context
@ -1816,7 +1815,7 @@ therefore __override__ (i.e., replace) those defined in __"base-config.xml"__.
@@ -1816,7 +1815,7 @@ therefore __override__ (i.e., replace) those defined in __"base-config.xml"__.
[source,java,indent=0]
[subs="verbatim,quotes"]
----
@RunWith(SpringJUnit4ClassRunner.class)
@RunWith(SpringRunner.class)
// ApplicationContext will be loaded from "/base-config.xml"
// in the root of the classpath
**@ContextConfiguration("/base-config.xml")**
@ -1840,7 +1839,7 @@ override (i.e., replace) those defined in `BaseConfig`.
@@ -1840,7 +1839,7 @@ override (i.e., replace) those defined in `BaseConfig`.
[source,java,indent=0]
[subs="verbatim,quotes"]
----
@RunWith(SpringJUnit4ClassRunner.class)
@RunWith(SpringRunner.class)
// ApplicationContext will be loaded from BaseConfig
@ -1863,7 +1862,7 @@ with Spring's `@Order` or the standard `@Priority` annotation.
@@ -1863,7 +1862,7 @@ with Spring's `@Order` or the standard `@Priority` annotation.
[source,java,indent=0]
[subs="verbatim,quotes"]
----
@RunWith(SpringJUnit4ClassRunner.class)
@RunWith(SpringRunner.class)
// ApplicationContext will be initialized by BaseInitializer
@ -1948,7 +1947,7 @@ Let's take a look at some examples with XML configuration and `@Configuration` c
@@ -1948,7 +1947,7 @@ Let's take a look at some examples with XML configuration and `@Configuration` c
----
package com.bank.service;
@RunWith(SpringJUnit4ClassRunner.class)
@RunWith(SpringRunner.class)
// ApplicationContext will be loaded from "classpath:/app-config.xml"
@ContextConfiguration("/app-config.xml")
@ActiveProfiles("dev")
@ -2067,7 +2066,7 @@ integration test but using `@Configuration` classes instead of XML.
@@ -2067,7 +2066,7 @@ integration test but using `@Configuration` classes instead of XML.
----
package com.bank.service;
@RunWith(SpringJUnit4ClassRunner.class)
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {
TransferServiceConfig.class,
StandaloneDataConfig.class,
@ -2115,7 +2114,7 @@ annotations) has been moved to an abstract superclass, `AbstractIntegrationTest`
@@ -2115,7 +2114,7 @@ annotations) has been moved to an abstract superclass, `AbstractIntegrationTest`
----
package com.bank.service;
@RunWith(SpringJUnit4ClassRunner.class)
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {
TransferServiceConfig.class,
StandaloneDataConfig.class,
@ -2406,7 +2405,7 @@ a `WebApplicationContext`.
@@ -2406,7 +2405,7 @@ a `WebApplicationContext`.
@ -2729,7 +2728,7 @@ application context for `ExtendedTests` will be loaded only from
@@ -2729,7 +2728,7 @@ application context for `ExtendedTests` will be loaded only from
@ -2811,7 +2810,7 @@ The first code listing shows a JUnit-based implementation of the test class that
@@ -2811,7 +2810,7 @@ The first code listing shows a JUnit-based implementation of the test class that
[source,java,indent=0]
[subs="verbatim,quotes"]
----
@RunWith(SpringJUnit4ClassRunner.class)
@RunWith(SpringRunner.class)
// specifies the Spring configuration to load for this test fixture
@ -3098,7 +3097,7 @@ See <<testing-examples-petclinic>> for an additional example.
@@ -3098,7 +3097,7 @@ See <<testing-examples-petclinic>> for an additional example.
@ -3434,7 +3433,7 @@ level within a JUnit-based integration test class.
@@ -3434,7 +3433,7 @@ level within a JUnit-based integration test class.
[source,java,indent=0]
[subs="verbatim,quotes"]
----
@RunWith(SpringJUnit4ClassRunner.class)
@RunWith(SpringRunner.class)
@ContextConfiguration
@Sql("/test-schema.sql")
public class DatabaseTests {
@ -3585,7 +3584,7 @@ be automatically rolled back by the `TransactionalTestExecutionListener` (see
@@ -3585,7 +3584,7 @@ be automatically rolled back by the `TransactionalTestExecutionListener` (see
@ -3625,13 +3624,14 @@ be automatically rolled back by the `TransactionalTestExecutionListener` (see
@@ -3625,13 +3624,14 @@ be automatically rolled back by the `TransactionalTestExecutionListener` (see
The __Spring TestContext Framework__ offers full integration with JUnit 4 through a
custom runner (supported on JUnit 4.12 or higher). By annotating test classes with
`@RunWith(SpringJUnit4ClassRunner.class)`, developers can implement standard JUnit-based
unit and integration tests and simultaneously reap the benefits of the TestContext
framework such as support for loading application contexts, dependency injection of test
instances, transactional test method execution, and so on. If you would like to use the
Spring TestContext Framework with an alternative runner such as JUnit's `Parameterized`
or third-party runners such as the `MockitoJUnitRunner`, you may optionally use
<<testcontext-junit4-rules,Spring's support for JUnit rules>> instead.
`@RunWith(SpringJUnit4ClassRunner.class)` or the shorter `@RunWith(SpringRunner.class)`
variant, developers can implement standard JUnit-based unit and integration tests and
simultaneously reap the benefits of the TestContext framework such as support for loading
application contexts, dependency injection of test instances, transactional test method
execution, and so on. If you would like to use the Spring TestContext Framework with an
alternative runner such as JUnit's `Parameterized` or third-party runners such as the
`MockitoJUnitRunner`, you may optionally use <<testcontext-junit4-rules,Spring's support
for JUnit rules>> instead.
The following code listing displays the minimal requirements for configuring a test class
to run with the custom Spring `Runner`. `@TestExecutionListeners` is configured with an
@ -3641,7 +3641,7 @@ empty list in order to disable the default listeners, which otherwise would requ
@@ -3641,7 +3641,7 @@ empty list in order to disable the default listeners, which otherwise would requ
[source,java,indent=0]
[subs="verbatim,quotes"]
----
@RunWith(SpringJUnit4ClassRunner.class)
@RunWith(SpringRunner.class)
@TestExecutionListeners({})
public class SimpleTest {
@ -3666,10 +3666,10 @@ The `org.springframework.test.context.junit4.rules` package provides the followi
@@ -3666,10 +3666,10 @@ The `org.springframework.test.context.junit4.rules` package provides the followi
_Spring TestContext Framework_; whereas, `SpringMethodRule` is a JUnit `MethodRule` that
supports instance-level and method-level features of the _Spring TestContext Framework_.
In contrast to the `SpringJUnit4ClassRunner`, Spring's rule-based JUnit support has the
advantage that it is independent of any `org.junit.runner.Runner` implementation and can
therefore be combined with existing alternative runners like JUnit's `Parameterized` or
third-party runners such as the `MockitoJUnitRunner`.
In contrast to the `SpringRunner`, Spring's rule-based JUnit support has the advantage
that it is independent of any `org.junit.runner.Runner` implementation and can therefore
be combined with existing alternative runners like JUnit's `Parameterized` or third-party
runners such as the `MockitoJUnitRunner`.
In order to support the full functionality of the TestContext framework, a
`SpringClassRule` must be combined with a `SpringMethodRule`. The following example
@ -3732,7 +3732,7 @@ provides an `executeSqlScript(..)` method for executing SQL scripts against the
@@ -3732,7 +3732,7 @@ provides an `executeSqlScript(..)` method for executing SQL scripts against the
====
These classes are a convenience for extension. If you do not want your test classes to be
tied to a Spring-specific class hierarchy, you can configure your own custom test classes
by using `@RunWith(SpringJUnit4ClassRunner.class)` or <<testcontext-junit4-rules,Spring's
by using `@RunWith(SpringRunner.class)` or <<testcontext-junit4-rules,Spring's
JUnit rules>>.
====
@ -3832,7 +3832,7 @@ JUnit-based example of using Spring MVC Test:
@@ -3832,7 +3832,7 @@ JUnit-based example of using Spring MVC Test:
@ -676,8 +676,9 @@ Spring 4.3 also improves the caching abstraction as follows:
@@ -676,8 +676,9 @@ Spring 4.3 also improves the caching abstraction as follows:
=== Testing Improvements
* The JUnit support in the _Spring TestContext Framework_ now requires JUnit 4.12 or higher.
* New `SpringRunner` __alias__ for the `SpringJUnit4ClassRunner`.
* Server-side Spring MVC Test supports expectations on response headers with multiple values.
* Server-side Spring MVC Test parses form data request content and populates request parameters.
* Client-side REST test support allows indicating how many times a request is expected and
whether the oder of declaration for expectations should be ignored (see <<spring-mvc-test-client>>)
whether the order of declaration for expectations should be ignored (see <<spring-mvc-test-client>>).
* Client-side REST Test supports expectations for form data in the request body.