2016-02-19 20 views
27

Mockito tạo một cá thể proxy khi một số thứ được theo dõi. Bây giờ, có cách nào để chuyển tiếp các setters sau đó được thực thi trên cá thể proxy đó tới thực thể thực sự nằm đằng sau nó không?Làm thế nào để theo dõi đúng hoạt động

Lý do: Tôi có một cá thể đối tượng mà tôi không hoàn toàn nằm dưới sự kiểm soát của tôi, tức là hoạt động trên Android. Tôi có thể cung cấp cho hầu hết các phần của ứng dụng phiên bản proxy và chạy tốt như nhưng vì tôi cần tạo gián điệp/proxy rất sớm trong giai đoạn tạo hoạt động, nó chưa được khởi tạo đầy đủ, ví dụ: bối cảnh cơ bản không được đính kèm. Điều này xảy ra trên cá thể proxy và dĩ nhiên không được sử dụng bởi cá thể hoạt động (chính nó đề cập đến chính nó qua Activity.this). Kết quả cuối cùng là điều này dẫn đến tất cả các loại sự cố vì giải quyết tài nguyên xảy ra thông qua bối cảnh cơ sở này, do đó, máy móc Fragment nội bộ ném NPE và hơn thế nữa.

Dưới đây là một số mã:

public class CustomAndroidJUnitRunner extends AndroidJUnitRunner { 
    @Override 
    public Activity newActivity(ClassLoader cl, String className, Intent intent) 
      throws InstantiationException, IllegalAccessException, ClassNotFoundException { 
     Activity activity = super.newActivity(cl, className, intent); 
     return maybeStubSomeDelegate(activity); 
    } 

    private Activity maybeStubSomeDelegate(Activity activity) { 
     if (!(activity instanceof SomeDelegate)) { 
      return activity; 
     } 
     Activity spiedActivity = spy(activity); 
     doReturn(SomeDelegateMock.getInstance()) 
      .when((SomeDelegate) spiedActivity) 
      .getDelegate(); 
     return spiedActivity; 
    } 
} 

Tôi tránh khỏi thất bại - bất kỳ ý tưởng?

+0

Tại sao bạn không dùng cà phê: https://google.github.io/android-testing-support-library/docs/espresso/ Vì vậy, bạn cũng có thể kiểm soát hoạt động. –

+0

Tôi đã sử dụng Espresso, điều này không liên quan gì đến câu hỏi của tôi. –

+0

đang thêm phương thức @VisibleForTesting setDelegate() vào hoạt động của bạn ngoài câu hỏi? Tôi cảm thấy rằng bất kỳ phương pháp nào liên quan đến việc tiêm gián điệp của Hoạt động sẽ luôn có một số trường hợp cạnh mà nó sẽ không hoạt động. – jdonmoyer

Trả lời

0

Bạn có thể sử dụng Robolectric để tạo proxy của riêng bạn (hoặc như Robolectric gọi họ là "Shadows") để hoạt động của bạn,

Khi bạn tạo proxy bạn có thể tạo setters của riêng bạn có thể kích hoạt các phương pháp đối tượng thực,

Làm thế nào để tạo ra một ví dụ bóng:

@Implements(Bitmap.class) 
public class MyShadowBitmap { 

@RealObject private Bitmap realBitmap; 
private int bitmapQuality = -1; 

@Implementation 
public boolean compress(Bitmap.CompressFormat format, int quality, OutputStream stream) { 
    bitmapQuality = quality; 
    return realBitmap.compress(format, quality, stream); 
} 

public int getQuality() { 
    return bitmapQuality; 
} 
} 
} 

khi @RealObject là ví dụ thực sự của bạn,

để sử dụng này là hadow sử dụng Robolectric Test Runner định nghĩa một lớp thử nghiệm mới như sau:

@RunWith(RobolectricTestRunner.class) 
@Config(shadows = MyShadowBitmap.class) 
public class MyTestClass {} 

Để kéo dụ bóng hiện nay sử dụng phương pháp:

shadowOf() 

Và trong mọi trường hợp, đây là s liên kết đến Robolectric:

http://robolectric.org/custom-shadows/

+0

Điều này có thể hữu ích cho việc thử nghiệm đơn vị, nhưng tôi thực sự đang nói về kiểm tra thiết bị đo đạc :) –

+0

Cũng hữu ích cho các thử nghiệm thiết bị (giả sử bạn không muốn chúng chạy trên thiết bị \ emulator) –

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