8

Tôi chưa tìm thấy bất kỳ ví dụ nào về cách thực hiện việc này. Tôi giả định rằng không thể dựa trên các ví dụ như thế này:Có thể tiêm mocks cho mục đích thử nghiệm với AndroidAnnotations không?

@Bean(MyImplementation.class) 
MyInterface myInterface; 

nơi lớp học này được xác định.

+0

Bạn đang tìm cách kiểm tra lớp học của mình hoặc lớp học được tạo bởi AndroidAnnotations? –

+0

Tôi muốn kiểm tra một lớp học mà tôi viết. Tôi muốn tiêm mocks vào lớp mà tôi viết cho mã thử nghiệm, và tiêm các đối tượng "thực" cho sản xuất. – apollodude217

Trả lời

6

Câu hỏi đặt ra là, bạn là thử nghiệm đơn vị hay thử nghiệm tích hợp?

Nếu bạn là đơn vị thử nghiệm, tôi sẽ đề nghị sử dụng mocks theo cách cũ, bằng cách sử dụng một setter và cố gắng để kiểm tra mã Java mà không có khuôn khổ tiêm phụ thuộc có liên quan. Điều này sẽ kiểm tra lớp học của bạn trong sự cô lập và sidesteps rất nhiều phức tạp.

Những gì tôi có nghĩa là:

public class Test{ 

    ClassInTest inTest; 
    MyInterface myInterface; 

    @Before 
    public void setup(){ 
     inTest = new ClassInTest(); 
     //or your favorite mocking frameowrk 
     myInterface = EasyMock.createMock(MyInterface.class); 
     inTest.setMyInterface(myInterface); 
    } 

    @Test 
    public void testMethod(){ 
     //...mocking test code 
    } 
} 

Tất nhiên, thử nghiệm hoạt động Android (và phần mở rộng khác của Android) là khó khăn vì sự ngoại lệ ném cuống và các lớp học chính thức/phương pháp. Đây là nơi mà Robolectric có ích (và được khuyến nghị) cho việc khởi tạo/che giấu API Android.

Nếu bạn là thử nghiệm tích hợp, bạn có thể muốn thực hiện một cách tiếp cận khác. Cá nhân, tôi sẽ cố gắng không để giả lập trong các bài kiểm tra tích hợp như tôi cố gắng để kiểm tra các ứng dụng như nó sẽ chạy trong sản xuất. Tuy nhiên, nếu bạn thực sự muốn giả lập, bạn có thể sử dụng phương pháp tương tự để thử nghiệm đơn vị và giới thiệu mô hình sau khi bạn đứng lên lớp Hoạt động đã tạo. Đáng chú ý, bạn có thể thực hiện các bài kiểm tra tích hợp trực tiếp trên phần cứng bằng cách sử dụng các khung công tác như Robotium.

Thêm vào câu hỏi của bạn, tôi không biết bất kỳ cơ sở nào của AndroidAnnotations dành riêng cho việc tiêm Mocks hoặc giới thiệu Mocks vào cây phụ thuộc được tiêm của ứng dụng.

+0

Cảm ơn. Tôi đã bắt đầu sử dụng Robolectric cho các bài kiểm tra đơn vị. Trong ví dụ bạn đã đưa ra ở trên, bạn có đang nói để gọi hàm tạo của lớp của tôi trong phương pháp thử nghiệm để bỏ qua AndroidAnnotations trong khi kiểm tra hoàn toàn không? – apollodude217

+1

Gọi cho nhà xây dựng (với Robolectic có liên quan) chỉ cho bạn một ví dụ về Hoạt động. Tôi sẽ không nói điều này bỏ qua AndroidAnnotaions. Tuy nhiên, nếu bạn kiểm tra lớp "MyActivity" (vs "MyActivity_") thì bạn sẽ không có mã được tạo ra chịu trách nhiệm về DI từ AA. –

8

Một bổ sung cho johncarl câu trả lời:

  • Không có cách nào để nói với AndroidAnnotations mà bạn muốn tiêm mocks thay vì các đối tượng thực, bởi vì nó hoạt động tại thời gian biên dịch, vì vậy mã phải luôn luôn được sản xuất sẳn sàng.

  • Tôi khuyên bạn nên thử nghiệm các hoạt động đã tạo, bổ sung với Robolectric. Các chú thích đang thêm hành vi vào mã của bạn, vì vậy bạn không nên kiểm tra nó như thể không có chú thích nào.

  • Hãy cẩn thận kiểm tra hành vi hoạt động của bạn, chứ không phải hành vi của AndroidAnnotations. Khung đã có các thử nghiệm của riêng nó để kiểm tra xem chú thích có hoạt động chính xác không :).

  • Bạn có thể cho phép AndroidAnnotations DI diễn ra và sau đó chiếu lại phụ thuộc giả tạo. Các trường có ít nhất phạm vi mặc định, có nghĩa là chúng có thể được truy cập từ cùng một gói, do đó bạn phải tạo thử nghiệm trong cùng một gói với hoạt động.

    MyActivity_ activity = new MyActivity_(); 
    
    // myInterface gets injected 
    activity.onCreate(null); 
    
    // you reinject myInterface 
    activity.myInterface = Mockito.mock(MyInterface.class); 
    
  • Trong AndroidAnnotations, dependencies được tiêm bằng cách gọi MyImplementation_.getInstance_(). Bạn có thể sử dụng thao tác bytecode thời gian chạy bằng công cụ như PowerMock để cho phương thức getInstance_() của MyImplementation_ trả về một mô hình. Điều này có thể yêu cầu một số công việc ban đầu mặc dù, bởi vì bạn sẽ phải trộn Á hậu thử nghiệm PowerMock và Á hậu thử nghiệm Robolectric.

Chỉnh sửa: Tôi đã cập nhật documentation với nội dung dựa trên câu hỏi này.

+1

+1. Điều thú vị là bạn đề xuất thử nghiệm các Hoạt động đã tạo (pt.2). Tôi đoán có đủ thay đổi đối với Hoạt động để đảm bảo cách tiếp cận này. –

+0

Đó chính xác là điểm của tôi :) –

+1

@ Piwaï Tôi không chắc chắn cách thức tiếp cận giả mạo ở trên sẽ hoạt động như thế nào. Nếu bạn có bất kỳ phương thức nào được chú thích với AfterViews, chúng sẽ được thực hiện như một phần của việc tạo Hoạt động. Nếu những phương pháp này có bất kỳ phụ thuộc nào thì chúng sẽ thất bại - vì bạn chưa có cơ hội thử nghiệm chúng. Bất kỳ ý tưởng về cách làm việc xung quanh điều này? – Neil

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