Xem toàn bộ series bài viết hướng dẫn xây dựng ứng dụng Questions Management tại đây.
Trong bài viết trước, chúng ta đã chuẩn bị tất cả các cấu hình cần thiết để có thể xây dựng API lấy tất cả các question có trong MongoDB database như: một đối tượng document Question chứa thông tin của một question, một QuestionRepository để thao tác với MongoDB, một QuestionController định nghĩa các API của Core Question Service sẽ bắt đầu với “/question” và thông tin về kết nối đến MongoDB server được cấu hình trong tập tin application.properties. Bây giờ, chúng ta sẽ tiến hành xây dựng API để này các bạn nhé!
Để xây dựng API lấy tất cả question, mình sẽ thêm mới một method để expose một GET request “/all”:
1 2 3 4 |
@GetMapping("/all") public Flux<Question> findAllQuestions() { } |
Vì Spring Data Mongo Reactive đã hỗ trợ cho chúng ta method tìm kiếm tất cả các question rồi nên việc của chúng ta chỉ là gọi để sử dụng mà thôi:
1 2 3 4 |
@GetMapping("/all") public Flux<Question> findAllQuestions() { return questionRepository.findAll(); } |
Xong rồi đó các bạn! 🙂 Bây giờ test thử xem nhé.
Giả sử trong database mình đang có những question sau:
thì khi mình chạy request để lấy tất cả question đang có, kết quả sẽ là:
Bây giờ chúng ta sẽ thêm mới Unit Test cho code mà chúng ta vừa thêm vào, các bạn nhé!
Trong bài viết trước, mình đã tạo mới class test cho QuestionController tên là QuestionControllerTest, đối tượng Mock cho QuestionRepository và inject đối tượng Mock này vào class QuestionController, khởi tạo các đối tượng Mock mỗi khi chạy một test case như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
package com.huongdanjava.questionservice; import org.junit.Before; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import com.huongdanjava.questionservice.repository.QuestionRepository; public class QuestionControllerTest { @Mock private QuestionRepository questionRepository; @InjectMocks private QuestionController questionController; @Before public void init() { MockitoAnnotations.initMocks(this); } } |
Giờ mình sẽ thêm mới một phương thức để test cho phương thức của findAllQuestions() của class QuestionController như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
@Test public void testFindAllQuestions() { // Create Question document to return when using findAll Question question = new Question(); question.setId("123"); question.setDescription("Test"); question.setCategoryId("123XYZ"); // Mock findAll() method of QuestionRepository to return a Flux when(questionRepository.findAll()).thenReturn(Flux.just(question)); // Call method Flux<Question> questions = questionController.findAllQuestions(); Question result = questions.blockFirst(); // Assertions assertEquals("123", result.getId()); assertEquals("Test", result.getDescription()); assertEquals("123XYZ", result.getCategoryId()); } |
Chạy “Maven test” trong STS hoặc “mvn test” với Apache Maven, các bạn sẽ không lỗi nào cả.