This example show how to write Spring integration tests with JUnit 5.
Since Spring 5.0, full support for JUnit 5 is provided.
Example
Creating a simple Spring test application.
pom.xml<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.12.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>6.2.13</version>
</dependency>
ShoppingCart
package com.logicbig.example;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
@Component
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class ShoppingCart {
@Autowired
private OrderService orderService;
private List<Order> orders = new ArrayList<>();
public void addItem(String name, int qty) {
orders.add(new Order(name, qty));
}
public String checkout() {
String msg = orderService.placeOrders(orders);
orders.clear();
return msg;
}
}
OrderService
package com.logicbig.example;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class OrderService {
public String placeOrders(List<Order> orders) {
//just a dummy service
return orders.size() + " orders placed";
}
}
package com.logicbig.example;
public class Order {
private String item;
private int qty;
public Order(String item, int qty) {
this.item = item;
this.qty = qty;
}
public String getItem() {
return item;
}
public int getQty() {
return qty;
}
}
AppConfig
package com.logicbig.example;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan("com.logicbig.example")
public class AppConfig {
}
JUnit 5 test
In JUnit 5 we use @ExtendsWith rather than @RunWith The difference between the two is, @RunWith (JUnit 4) replaces the default test runner with a custom test runner. @ExtendsWith (JUnit 5) is more flexible and plugs into extension point.
Spring provides SpringExtension to be used with @ExtendsWith. SpringExtension is actually the JUnit 5 successor to SpringRunner, both are essentially the same thing, i.e. both provides Spring context support in JUnit tests.
package com.logicbig.example;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = AppConfig.class)
public class ShoppingCartTest {
@Autowired
private ShoppingCart shoppingCart;
@Test
public void testCheckout() {
shoppingCart.addItem("Item1", 2);
shoppingCart.addItem("item2", 5);
String result = shoppingCart.checkout();
Assertions.assertEquals("2 orders placed", result);
}
}
mvn test OutputD:\example-projects\spring-core-testing\spring-testing-junit-5>mvn test [INFO] Scanning for projects... [INFO] [INFO] ------------< com.logicbig.example:spring-testing-junit-5 >------------- [INFO] Building spring-testing-junit-5 1.0-SNAPSHOT [INFO] from pom.xml [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- resources:3.3.1:resources (default-resources) @ spring-testing-junit-5 --- [INFO] skip non existing resourceDirectory D:\example-projects\spring-core-testing\spring-testing-junit-5\src\main\resources [INFO] [INFO] --- compiler:3.3:compile (default-compile) @ spring-testing-junit-5 --- [INFO] Nothing to compile - all classes are up to date [INFO] [INFO] --- resources:3.3.1:testResources (default-testResources) @ spring-testing-junit-5 --- [INFO] skip non existing resourceDirectory D:\example-projects\spring-core-testing\spring-testing-junit-5\src\test\resources [INFO] [INFO] --- compiler:3.3:testCompile (default-testCompile) @ spring-testing-junit-5 --- [INFO] Nothing to compile - all classes are up to date [INFO] [INFO] --- surefire:3.2.5:test (default-test) @ spring-testing-junit-5 --- [INFO] Using auto detected provider org.apache.maven.surefire.junitplatform.JUnitPlatformProvider [INFO] [INFO] ------------------------------------------------------- [INFO] T E S T S [INFO] ------------------------------------------------------- [INFO] Running com.logicbig.example.ShoppingCartTest [INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.364 s -- in com.logicbig.example.ShoppingCartTest [INFO] [INFO] Results: [INFO] [INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 [INFO] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 11.647 s [INFO] Finished at: 2025-11-15T22:28:03+08:00 [INFO] ------------------------------------------------------------------------
Example ProjectDependencies and Technologies Used: - spring-context 6.2.13 (Spring Context)
Version Compatibility: 5.0.0.RELEASE - 6.2.13 Version compatibilities of spring-context with this example: Versions in green have been tested.
- spring-test 6.2.13 (Spring TestContext Framework)
- junit-jupiter-engine 5.12.2 (Module "junit-jupiter-engine" of JUnit 5)
- JDK 25
- Maven 3.9.11
|