2015-05-14 20 views
6

Tôi đang thử nghiệm đơn vị xây dựng trong một ứng dụng Java khởi động Spring cho một lớp dịch vụ.Kiểm tra đơn vị với jUnit và Mockito cho các cuộc gọi API REST bên ngoài

Lớp dịch vụ thực hiện cuộc gọi bên ngoài đến dịch vụ REST API trả về phản hồi JSON. Tôi đang chế nhạo cuộc gọi này bằng Mockito. Tôi hardcoding một JSON trong phản ứng mockserver.

Thực tiễn không tốt này có JSON được mã hóa cứng trong các thử nghiệm đơn vị của bạn không? Nếu cấu trúc JSON thay đổi, thì thử nghiệm sẽ thất bại là lý do của tôi. Có cách nào tốt hơn, tốt nhất để làm điều này không?

Ví dụ Snippet dưới đây:

Mã thực tế là chức năng, tôi vừa mới chỉnh sửa đoạn này nó cho ngắn gọn để có được những ý tưởng trên, vì vậy viết bình luận nếu bạn thấy bất kỳ lỗi:

public class UserServiceTest extends TestCase { 

    private static final String MOCK_URL = "baseUrl"; 
    private static final String DEFAULT_USER_ID = "353"; 

    UserService classUnderTest; 
    ResponseEntity<Customer> mockResponseEntity; 
    MockRestServiceServer mockServer; 
    @Mock 
    RestTemplate mockRestTemplate; 

    public void setUp() throws Exception { 
     super.setUp(); 

     classUnderTest = new UserRestService(); 
     mockRestTemplate = new RestTemplate(); 
     mockServer = MockRestServiceServer.createServer(mockRestTemplate); 

     ReflectionTestUtils.setField(classUnderTest, "restTemplate", 
       mockRestTemplate); 
     ReflectionTestUtils.setField(classUnderTest, "userSvcUrl", 
       MOCK_URL); 
    } 

    public void testGetUserById() throws Exception { 

     mockServer.expect(requestTo(MOCK_URL + "/Users/" + DEFAULT_USER_ID)).andExpect(method(HttpMethod.GET)) 
       .andRespond(withSuccess(
         "{\n" + 
           " \"UserCredentials\": {\n" + 
           "  \"Password\": \"\",\n" + 
           "  \"PasswordNeedsUpdate\": false,\n" + 
           "  \"Security\": [\n" + 
           "   {\n" + 
           "    \"Answer\": \"\",\n" + 
           "    \"Question\": \"Why did the bicycle fall over?\"\n" + 
           "   }\n" + 
           "  ]\n" + 
           "}" 
         , MediaType.APPLICATION_JSON)); 


     Customer customer = classUnderTest.getUserById(DEFAULT_USER_ID); 

     mockServer.verify(); 
     assertNotNull(customer); 
     assertEquals(DEFAULT_USER_ID, customer.getId()); 
    } 
} 
+0

JUnit cho tôi biết phương pháp thiết lập phải tĩnh. Phương thức withSuccess() được định nghĩa ở đâu? – chrisinmtown

Trả lời

7

Tôi hiện đang ở trên cùng một thuyền như bạn và lý do của tôi như sau: Tạo giả JSON-phản hồi giống như chế nhạo một đối tượng và kiểm soát nó bằng cách sử dụng Mockito.when. Bạn sẽ cần phải thay đổi bất cứ điều gì trong cuộc gọi when().thenReturn() khi bạn thay đổi một số phân tích bên trong hoặc bạn mong đợi các kết quả khác nhau. Điều này cũng tương tự với một phản hồi JSON trong đó các cuộc gọi được thay đổi và các biểu diễn đối tượng được thay đổi.

Vì vậy, dự đoán của tôi là điều này là tốt. Đọc các bài báo khác nhau về kiểm tra REST API, sự đồng thuận chung là việc tạo ra các câu trả lời JSON giả là thực hành tốt. Thực hành tốt nhất là (tùy từng thời điểm) tải xuống phản hồi JSON thực và chèn câu trả lời này làm phản hồi giả. Bằng cách này, bạn có thể giữ cho các bài kiểm tra của bạn được cập nhật với bên ngoài, trong khi các bài kiểm tra có thể chạy mà không cần các yêu cầu internet.

Chỉnh sửa theo yêu cầu:

+0

Hey Tim bạn có thể chỉnh sửa bài đăng của mình với một số nguồn bạn đã sử dụng chỉ để tham khảo không? – anataliocs

+0

Xin chào Anataliocs, tôi đã thêm một số tài liệu tham khảo tôi tìm thấy. Hy vọng họ giúp bạn =] –

+1

Tuyệt vời, cảm ơn rất nhiều. Điều đó mang lại cho tôi sự tự tin hơn rất nhiều trong cách tiếp cận của tôi, vì các bài kiểm tra đơn vị xấu gần như tồi tệ nhất so với các bài kiểm tra mà họ nói;) – anataliocs

4

Tôi muốn chiếu sáng một cách tiếp cận khác để xem xét và đó là tạo POJO (ví dụ: mô hình dữ liệu, JavBean) của đối tượng mà JSON đại diện sau đó sử dụng trình nối tiếp JSON, như Gson từ Google, để chuyển đổi nó thành một chuỗi JSON.

UserCredentials uc = new UserCredentials(); 
//set the values 
Gson gson = new GsonBuilder().setPrettyPrinting().create(); 
String json = gson.toJson(uc); 
+0

Tôi thậm chí không nghĩ về điều đó. Tôi thích cách tiếp cận đó rất nhiều. Cảm ơn các đầu vào. – anataliocs

Các vấn đề liên quan