JUnit5 - @SpringBootTest, @SpringExtension vs @MockitoExtension
2022, Jul 28
Giải thích các annotation @SpringBootTest, @ExtendWith khi viết unit test trong Spring Boot application
Ví dụ project sau
@SpringBootTest
@SpringBootTest khởi tạo toàn bộ Spring Context bằng cách tìm kiếm class có gắn annotation @SpringBootApplication để thực hiện
Ví dụ
Run Test trên sẽ cho kết quả in toàn bộ bean của Spring được khởi tạo
Sau khi khởi tạo xong, có thể sử dụng @Autowired để lấy các bean trong Spring context ra test
@ExtendWith(SpringExtension.class)
Khởi tạo môi trường test do Spring quản lý, nhưng chỉ có vài bean cần thiết được tạo ra
Kết quả in ra các bean sau
Sử dụng @Import([Class cần test]) để tạo bean class đó và sử dụng @Autowired để lấy bean ra test
@ExtendWith(MockitoExtension.class)
Tạo một môi trường test do Mockito quản lý. Môi trường này không phải của Spring sẽ không có bất kỳ bean nào được tạo ra, dù @Autowired ApplicationContext cũng báo lỗi ngay NullPointerException
Sử dụng annotation @InjectMocks và @Mock để tạo ra các object cần test cũng như giải lập object để test
Conclusion
Nếu chỉ muốn unit test logic của method thì chỉ nên sử dụng MockitoExtension, sau đó tạo và giải lập các object để test
Và chỉ nên sử dụng SpringExtension và SpringBootTest trong trường hợp muốn integration test một vài component hoặc tất cả component. Vì SpringBootTest sẽ khởi tạo toàn bộ Spring context sẽ mất nhiều thời gian nên hạn chế sử dụng