1. Overview of Spring Boot Test
Spring Boot Test is a part of the Spring Boot framework that simplifies the testing of Spring components. It offers several annotations and utilities to help you write comprehensive tests for your application. Some key features include:
- Integration Testing: Test your application with a real Spring context.
- Mocking: Mocking beans and services to test specific parts of your application.
- Testing Configuration: Load application contexts and configurations for testing purposes.
2. Key Annotations and Utilities
2.1 @SpringBootTest
The @SpringBootTest
annotation is used to create an application context and load it for testing. It is useful for integration testing where you need to test the full application context.
@SpringBootTest
public class ApplicationTests {
@Test
void contextLoads() {
}
}
2.2 @MockBean
The @MockBean
annotation allows you to add Mockito mocks to the Spring application context. This is useful for unit testing where you want to isolate the component being tested.
@SpringBootTest
public class ServiceTests {
@MockBean
private MyService myService;
@Autowired
private MyController myController;
@Test
void testService() {
Mockito.when(myService.getData()).thenReturn("Mocked Data");
String result = myController.getData();
assertEquals("Mocked Data", result);
}
}
2.3 @DataJpaTest
The @DataJpaTest
annotation is used to test JPA repositories. It configures an in-memory database for testing and scans for JPA repositories.
@DataJpaTest
public class RepositoryTests {
@Autowired
private MyRepository myRepository;
@Test
void testRepository() {
MyEntity entity = new MyEntity();
entity.setName("Test");
myRepository.save(entity);
List<MyEntity> entities = myRepository.findAll();
assertEquals(1, entities.size());
}
}
2.4 @WebMvcTest
The @WebMvcTest
annotation is used for testing Spring MVC controllers. It configures only the web layer and does not load the full application context.
@WebMvcTest(MyController.class)
public class ControllerTests {
@Autowired
private MockMvc mockMvc;
@Test
void testController() throws Exception {
mockMvc.perform(get("/endpoint"))
.andExpect(status().isOk())
.andExpect(content().string("Hello World"));
}
}
3. Demo: Testing a Simple Spring Boot Application
3.1 Create a Simple Spring Boot Application
Let's create a simple Spring Boot application with a controller, service, and repository.
@Entity
public class MyEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
}
MyRepository.java
public interface MyRepository extends JpaRepository<MyEntity, Long> {
}
MyService.java
@Service
public class MyService {
@Autowired
private MyRepository myRepository;
public String getData() {
return myRepository.findAll().stream()
.map(MyEntity::getName)
.collect(Collectors.joining(", "));
}
}
MyController.java
@RestController
public class MyController {
@Autowired
private MyService myService;
@GetMapping("/endpoint")
public String getData() {
return myService.getData();
}
}
3.2 Write Tests
Integration Test (ApplicationTests.java)
@SpringBootTest
public class ApplicationTests {
@Autowired
private MyController myController;
@Test
void contextLoads() {
assertNotNull(myController);
}
}
Service Test (ServiceTests.java)
@SpringBootTest
public class ServiceTests {
@MockBean
private MyRepository myRepository;
@Autowired
private MyService myService;
@Test
void testService() {
MyEntity entity = new MyEntity();
entity.setName("Test");
Mockito.when(myRepository.findAll()).thenReturn(Collections.singletonList(entity));
String result = myService.getData();
assertEquals("Test", result);
}
}
Controller Test (ControllerTests.java)
@WebMvcTest(MyController.class)
public class ControllerTests {
@Autowired
private MockMvc mockMvc;
@MockBean
private MyService myService;
@Test
void testController() throws Exception {
Mockito.when(myService.getData()).thenReturn("Mocked Data");
mockMvc.perform(get("/endpoint"))
.andExpect(status().isOk())
.andExpect(content().string("Mocked Data"));
}
}
4. Results
After running the tests, you should see the following results:
- Integration Test: Confirms that the application context loads correctly and the
MyController
bean is available. - Service Test: Verifies that the
MyService
returns the expected result when mocked data is provided. - Controller Test: Ensures that the
MyController
correctly responds to HTTP requests with mocked data
5. Conclusion
Using Spring Boot Test, you can effectively test various layers of your Spring Boot application. By leveraging annotations like @SpringBootTest
, @MockBean
, @DataJpaTest
, and @WebMvcTest
, you can write comprehensive tests that ensure your application behaves as expected. The provided examples and demo should give you a solid foundation to start writing your own tests.