2015-05-11 15 views
10

Added LeakCanary (1.3) để ứng dụng của tôi:NullPointerException từ LeakCanary khi chạy Robolectric kiểm tra

@Override 
public void onCreate() { 
    super.onCreate(); 
    Fabric.with(this, new Crashlytics()); 
    LeakCanary.install(this); 

Khi tôi chạy thử nghiệm bộ Robolectric cho các ứng dụng của tôi, tôi nhận được một NullPointerException trong LeakCanary.

Caused by: java.lang.NullPointerException 
at com.squareup.leakcanary.LeakCanary.isInServiceProcess(LeakCanary.java:165) 
at com.squareup.leakcanary.LeakCanary.isInAnalyzerProcess(LeakCanary.java:141) 
at com.squareup.leakcanary.LeakCanary.install(LeakCanary.java:52) 
at com.squareup.leakcanary.LeakCanary.install(LeakCanary.java:43) 
at com.package.application.MyApplication.onCreate(MyApplication.java:50) 
at org.robolectric.internal.ParallelUniverse.setUpApplicationState(ParallelUniverse.java:131) 
at org.robolectric.RobolectricTestRunner.setUpApplicationState(RobolectricTestRunner.java:431) 
at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:224) 

Tôi nói thêm rằng Im sử dụng Crashlytics chỉ ra rằng nó (và các phương pháp khác cũng) nhận được ứng dụng tương tự, nhưng không ném bất kỳ trường hợp ngoại lệ.

Bạn không chắc chắn điều này có nên ở đây hoặc trên các vấn đề GitHub cho LeakCanary hay không. Bất kỳ ai khác gặp sự cố này?

+1

Hãy xem mã nguồn của LeakCanary.java, Dường như HeapAnalyzerService không chạy khi thực hiện kiểm tra. – WenChao

+2

Ghi đè ứng dụng của bạn trong các thử nghiệm và ngăn chặn Crashlitics và LeakCanary initialisation. Thông tin thêm tại đây (http://robolectric.org/custom-test-runner/) –

+0

Cảm ơn! Tôi đã đi với tùy chọn lớp ứng dụng tùy chỉnh. – erafn

Trả lời

7

Chuyển nhận xét của tôi thành câu trả lời.

Robolectric cung cấp cách để xử lý các khởi tạo khác nhau và vòng đời kiểm tra ứng dụng thông qua ứng dụng thử nghiệm.

Đây là lớp ứng dụng của bạn:

public class <YourAppplication> extends Application { 
    @Override 
    public void onCreate() { 
     super.onCreate(); 
     Fabric.with(this, new Crashlytics()); 
     LeakCanary.install(this); 
    } 
} 

Bạn nên đặt trong các nguồn thử nghiệm trong gói tương tự như ứng dụng của bạn lớp tiếp theo:

public class Test<YourAppplication> extends <YourApplication> { 
    @Override 
    public void onCreate() { 
    } 
} 

Robolectric sẽ tải nó thay vì ứng dụng của bạn. Như bạn thấy, tôi loại bỏ tất cả các khởi tạo tĩnh từ ứng dụng của bạn.

Bạn có thể tìm thêm chi tiết here

0

Một cách đơn giản để tránh NullPointerException là để vô hiệu hóa LeakCanary cho unit tests bằng cách xác định việc phát hành (không-op) phiên bản trong chỉ thị testCompile trong build.gradle. Ví dụ:

dependencies { 
    ... 
    testCompile (
     'junit:junit:4.12', 
     'org.robolectric:robolectric:3.0', 
     'com.squareup.leakcanary:leakcanary-android-no-op:1.3.1' 
    ) 
    ... 
} 
Các vấn đề liên quan