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.
Trước khi đi vào xây dựng API đầu tiên cho Core Option Service, chúng ta cần chuẩn bị một số thứ như sau:
Đầu tiên là chúng ta cần tạo mới một interface OptionRepository extends từ interface ReactiveMongoRepository để thao tác với MongoDB database.
Nội dung của interface OptionRepository sẽ như sau:
1 2 3 4 5 6 7 8 9 |
package com.huongdanjava.optionservice.repository; import org.springframework.data.mongodb.repository.ReactiveMongoRepository; import com.huongdanjava.optionservice.document.Option; public interface OptionRepository extends ReactiveMongoRepository<Option, String> { } |
với đối tượng document Option:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
package com.huongdanjava.optionservice.document; import org.springframework.data.mongodb.core.mapping.Document; import lombok.Data; @Data @Document public class Option { private String id; private String description; private String note; private Boolean isCorrect; private String questionId; } |
Các bạn có thể xem thêm bài viết Reactive REST APIs với Spring Data MongoDB Reactive và Spring WebFlux để tham khảo thêm nhé!
Tiếp theo mình sẽ cấu hình phần kết nối tới MongoDB server.
Hiện tại mình đang sử dụng MongoDB server không phải là authentication mode nên mình chỉ cần khai báo như sau trong tập tin application.properties:
1 |
spring.data.mongodb.uri=mongodb://localhost:27017/qm |
Mình sẽ chạy service này sử dụng port 8083 nên mình sẽ thêm property server.port trong tập tin application.properties như sau:
1 |
server.port=8083 |
OK, mọi thứ chuẩn bị đã xong, bây giờ chúng ta sẽ đi vào phần chính của bài viết này các bạn nhé!
Mình sẽ tạo mới một controller tên là OptionController với nội dung như sau:
1 2 3 4 5 6 7 8 9 10 |
package com.huongdanjava.optionservice; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/option") public class OptionController { } |
Với khai báo trên, mình đã expose các API cho Core Option Service với request URL bắt đầu là “/option”.
Để thao tác với MongoDB server, chúng ta cần inject OptionRepository vào class OptionController như sau:
1 2 |
@Autowired private OptionRepository optionRepository; |
Để xây dựng API thêm mới option, mình sẽ thêm mới một method để expose một POST request “/add” với data trong phần body là đối tượng document Option:
1 2 3 4 |
@PostMapping("/add") public Mono<Option> createOption(@RequestBody Option option) { } |
Bởi vì Spring MongoDB Reactive đã hỗ trợ cho chúng ta phương thức save() để lưu data vào MongoDB nên mình chỉ cần gọi để sử dụng phương thức này mà thôi:
1 2 3 4 |
@PostMapping("/add") public Mono<Option> createOption(@RequestBody Option option) { return optionRepository.save(option); } |
Đến đây thì chúng ta đã hoàn thành việc xây dựng API thêm mới option cho Core Option Service, hãy test thử xem sao nhé các bạn.
Phần cuối cùng mà chúng ta cần làm là thêm mới Unit Test cho code mà chúng ta vừa thêm vào.
Mình sẽ tạo mới một class tên là OptionControllerTest nằm trong package src/test/java để test cho class OptionController.
Mock class OptionRepository:
1 2 3 4 5 6 7 8 9 10 11 12 |
package com.huongdanjava.optionservice; import org.mockito.Mock; import com.huongdanjava.optionservice.repository.OptionRepository; public class OptionControllerTest { @Mock private OptionRepository optionRepository; } |
Inject đối tượng mock của OptionRepository vào class OptionController:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
package com.huongdanjava.optionservice; import org.mockito.InjectMocks; import org.mockito.Mock; import com.huongdanjava.optionservice.repository.OptionRepository; public class OptionControllerTest { @Mock private OptionRepository optionRepository; @InjectMocks private OptionController optionController; } |
Để sử dụng các đối tượng mock, chúng ta phải khởi tạo chúng trước mỗi lần test một phương thức nên mình sẽ thêm một phương thức với annotation @Before của JUnit như sau:
1 2 3 4 |
@Before public void init() { MockitoAnnotations.initMocks(this); } |
Code để test phương thức createOption() 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 24 25 26 27 28 |
@Test public void testCreateOptionn() { // Create document need to insert into MongoDB Option option = new Option(); option.setDescription("Test"); option.setNote("Test"); option.setIsCorrect(true); option.setQuestionId("123XYZ"); // The result should be the same with additional id field Option result = option; result.setId("123"); // Mock save() method of OptionRepository when(optionRepository.save(option)).thenReturn(Mono.just(result)); // Call method Mono<Option> createdOptionAsMono = optionController.createOption(option); Option createdOption = createdOptionAsMono.block(); // Assertions assertEquals("Test", createdOption.getDescription()); assertEquals("Test", createdOption.getNote()); assertEquals("123XYZ", createdOption.getQuestionId()); assertEquals(true, createdOption.getIsCorrect()); assertEquals("123", createdOption.getId()); } |
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ả.