2012-12-06 25 views
8

Tôi đang sử dụng GWTP, thêm một lớp Hợp đồng để trừu tượng kiến ​​thức giữa Người trình bày và Chế độ xem và tôi khá hài lòng về kết quả với GWTP. Tôi đang thử nghiệm diễn giả của mình với Mockito.Thử nghiệm trình trình bày GWTP với các cuộc gọi không đồng bộ

Nhưng khi thời gian trôi qua, tôi thấy rất khó để duy trì một người trình bày rõ ràng với các bài kiểm tra của nó. Có một số công cụ tái cấu trúc tôi đã làm để cải thiện điều đó, nhưng tôi vẫn không hài lòng.

Tôi thấy nội dung sau là trung tâm của vấn đề: Người thuyết trình của tôi cần cuộc gọi không đồng bộ hoặc thường gọi đến phương thức đối tượng với gọi lại để tiếp tục luồng trình bày của tôi (thường được lồng nhau).

Ví dụ:

this.populationManager.populate(new PopulationCallback() 
    { 
    public void onPopulate() 
    { 
     doSomeStufWithTheView(populationManager.get()); 
    } 
    }); 

Trong các thử nghiệm của tôi, tôi đã kết thúc để xác minh các cuộc gọi dân() của đối tượng PopulationManager chế giễu. Sau đó, để tạo một thử nghiệm khác trên phương thức doSomeStufWithTheView().

Nhưng tôi phát hiện khá nhanh rằng đó là thiết kế xấu: bất kỳ thay đổi hoặc tái cấu trúc nào đã kết thúc để phá vỡ nhiều thử nghiệm của tôi và buộc tôi tạo từ những người khác, mặc dù chức năng của người thuyết trình không thay đổi! Plus Tôi đã không kiểm tra xem cuộc gọi lại có hiệu quả những gì tôi muốn hay không.

Vì vậy, tôi cố gắng sử dụng Mockito phương pháp doAnswer để không phá vỡ dòng chảy thử nghiệm dẫn chương trình của tôi:

doAnswer(new Answer(){ 
    public Object answer(InvocationOnMock invocation) throws Throwable 
    { 
     Object[] args = invocation.getArguments(); 
     ((PopulationCallback)args[0]).onPopulate(); 
     return null; 
    } 
}).when(this.populationManager).populate(any(PopulationCallback.class)); 

tôi yếu tố mã cho nó được ít verbose (và trong nội bộ ít phụ thuộc vào vị trí arg):

doAnswer(new PopulationCallbackAnswer()) 
    .when(this.populationManager).populate(any(PopulationCallback.class)); 

Vì vậy, trong khi chế giễu populationManager, tôi có thể vẫn kiểm tra dòng chảy của người dẫn chương trình của tôi, về cơ bản như thế:

@Test 
public void testSomeStuffAppends() 
{ 
    // Given 
    doAnswer(new PopulationCallbackAnswer()) 
    .when(this.populationManager).populate(any(PopulationCallback.class)); 

    // When 
    this.myPresenter.onReset(); 

    // Then 
    verify(populationManager).populate(any(PopulationCallback.class)); // That was before 
    verify(this.myView).displaySomething(); // Now I can do that. 
} 

Tôi tự hỏi nếu nó là một sử dụng tốt của phương pháp doAnswer, hoặc nếu nó là một mùi mã, và một thiết kế tốt hơn có thể được sử dụng?

Thông thường, diễn giả của tôi có xu hướng chỉ sử dụng đối tượng khác (như một số mẫu hòa giải) và tương tác với chế độ xem. Tôi có một số người trình bày với hàng trăm (~ 400) dòng mã.

Một lần nữa, đó có phải là bằng chứng về thiết kế xấu, hoặc là bình thường đối với người trình bày là tiết mục (vì sử dụng các đối tượng khác)?

Có ai đã nghe về một số dự án sử dụng GWTP và kiểm tra người trình bày của mình một cách sạch sẽ không?

Tôi hy vọng tôi đã giải thích một cách toàn diện.

Cảm ơn bạn trước.

PS: Tôi khá mới với Stack Overflow, cộng với tiếng Anh của tôi vẫn còn thiếu, nếu câu hỏi của tôi cần một cái gì đó để được cải thiện, xin vui lòng cho tôi biết.

Trả lời

1

Bạn có thể sử dụng ArgumentCaptor:
Xem chi tiết blog post này để biết thêm chi tiết.

+0

điều này thật hoàn hảo !!! +1 – EMM

0

Nếu tôi hiểu chính xác bạn đang hỏi về thiết kế/kiến ​​trúc.

Điều này không nên được tính là câu trả lời, đó chỉ là suy nghĩ của tôi.

mã nếu tôi đã theo:

public void loadEmoticonPacks() { 
    executor.execute(new Runnable() { 
     public void run() { 
      pack = loadFromServer(); 
      savePackForUsageAfter(); 
     } 
    }); 
} 

Tôi thường không tin tưởng vào người thi hành và chỉ cần kiểm tra rằng các phương pháp thực hiện công việc bê tông bằng tải và tiết kiệm. Vì vậy, người thực hiện ở đây chỉ là công cụ để ngăn chặn các hoạt động dài trong chuỗi giao diện người dùng.

Nếu tôi có một cái gì đó như:

accountManager.setListener(this); 
.... 
public void onAccountEvent(AccountEvent event) { 
.... 
} 

tôi sẽ kiểm tra đầu tiên mà chúng tôi đăng ký cho các sự kiện (và đã hủy đăng ký trên một số phá hủy) cũng tôi sẽ kiểm tra rằng onAccountEvent không mong đợi kịch bản.

UPD1. Có thể, trong ví dụ 1, tốt hơn sẽ là phương pháp trích xuất loadFromServerAndSave và kiểm tra xem nó không được thực hiện trên chuỗi giao diện người dùng cũng như kiểm tra xem nó có làm mọi thứ như mong đợi hay không.

UPD2. Tốt hơn nên sử dụng khung như Guava Bus để xử lý sự kiện.

0

Chúng tôi cũng đang sử dụng mẫu doAnswer này trong các bài kiểm tra của người trình bày của chúng tôi và thường nó hoạt động tốt. Mặc dù vậy, nếu bạn kiểm tra nó như thế này, bạn sẽ loại bỏ bản chất không đồng bộ của cuộc gọi một cách hiệu quả, đó là gọi lại được thực thi ngay lập tức sau khi cuộc gọi máy chủ được khởi tạo.

Điều này có thể dẫn đến các điều kiện chủng tộc chưa được khám phá. Để kiểm tra những điều đó, bạn có thể thực hiện quy trình gồm hai bước này: khi gọi máy chủ, phương thức trả lời chỉ lưu lại gọi lại. Sau đó, khi nó thích hợp trong bài kiểm tra của bạn, bạn gọi sometinh như flush() hoặc onSuccess() trên câu trả lời của bạn (tôi khuyên bạn nên tạo một lớp tiện ích để có thể sử dụng lại trong các trường hợp khác), để bạn có thể kiểm soát khi gọi lại cho kết quả thực sự được gọi.

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