DEV Community

Anh Trần Tuấn
Anh Trần Tuấn

Posted on • Originally published at tuanh.net on

Spring Boot Test for Application Testing

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() {
    }
}
Enter fullscreen mode Exit fullscreen mode

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);
    }
}
Enter fullscreen mode Exit fullscreen mode

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());
    }
}
Enter fullscreen mode Exit fullscreen mode

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"));
    }
}
Enter fullscreen mode Exit fullscreen mode

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;

    // Getters and setters
}
Enter fullscreen mode Exit fullscreen mode

MyRepository.java

public interface MyRepository extends JpaRepository<MyEntity, Long> {
}
Enter fullscreen mode Exit fullscreen mode

MyService.java

@Service
public class MyService {

    @Autowired
    private MyRepository myRepository;

    public String getData() {
        return myRepository.findAll().stream()
                            .map(MyEntity::getName)
                            .collect(Collectors.joining(", "));
    }
}
Enter fullscreen mode Exit fullscreen mode

MyController.java

@RestController
public class MyController {

    @Autowired
    private MyService myService;

    @GetMapping("/endpoint")
    public String getData() {
        return myService.getData();
    }
}
Enter fullscreen mode Exit fullscreen mode

3.2 Write Tests

Integration Test (ApplicationTests.java)

@SpringBootTest
public class ApplicationTests {

    @Autowired
    private MyController myController;

    @Test
    void contextLoads() {
        assertNotNull(myController);
    }
}
Enter fullscreen mode Exit fullscreen mode

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);
    }
}
Enter fullscreen mode Exit fullscreen mode

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"));
    }
}
Enter fullscreen mode Exit fullscreen mode

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.

Read posts more at : Spring Boot Test for Application Testing

Top comments (0)