2015-12-11 18 views
14

Tôi có một lớp đơn giản Job kéo dài HandlerThread:Robolectric 3.0, thất bại trong việc thử nghiệm một chức năng mà bắt đầu một HandlerThread

public class Job extends HandlerThread{ 
    public Job(String name) { 
    super(name); 
    } 
    ... 
} 

Sau đó, tôi có một lớp JobUtils trong đó có một chức năng để có được một Job & start() nó :

public JobUtils { 
    public JobUtils() { 
    } 

    // I unit test this function in my test class below 
    public Job getAndStartJob(String name) { 
     Job job = new Job(name); 
     job.start(); 
    } 
} 

tôi sử dụng Robolectric 3,0 trong thử nghiệm đơn vị của tôi, tôi thử nghiệm JobUtils lớp getAndStartJob(String name) functi vào lúc:

@RunWith(RobolectricTestRunner.class) 
public class TestJobUtils{ 
@Test 
public void testGetAndStartJob() { 
    JobUtils jobUtils = new JobUtils(); 

    // error here 
    jobUtils.getAndStartJob(“test-job”); 
    … 
} 
} 

Khi tôi chạy mã đơn vị thử nghiệm của tôi, tôi đã nhận lỗi

Exception in thread "test-job” java.lang.NullPointerException 
    at org.robolectric.shadows.ShadowLooper.getMainLooper(ShadowLooper.java:70) 
    at org.robolectric.shadows.ShadowLooper.doLoop(ShadowLooper.java:85) 
    at org.robolectric.shadows.ShadowLooper.loop(ShadowLooper.java:76) 
    at android.os.Looper.loop(Looper.java) 
    at android.os.HandlerThread.run(HandlerThread.java:60) 

Dường như Robolectric không có khả năng để bắt đầu HandlerThread (các job instace trong mã của tôi), hoặc làm Tôi nhớ cái gì? Làm thế nào để thoát khỏi vấn đề này?

Trả lời

3

Tôi gặp sự cố tương tự, không chắc chắn lý do của bạn có giống nhau hay không vì tôi đã sử dụng RobolectricGradleTestRunner và bạn chưa đăng toàn bộ nội dung phương pháp thử nghiệm. Trong trường hợp của tôi nó chỉ ra rằng ứng dụng Robolectric (RuntimeEnvironment.application) được thiết lập để null (nguồn của NPE) trước khi HandlerThread bắt đầu thực hiện vì phương pháp thử nghiệm đạt đến kết thúc sớm hơn.

Cách giải quyết là để chờ đợi cho tất cả Runnables dự kiến ​​vào cuối phương pháp thử nghiệm:

Robolectric.flushBackgroundThreadScheduler(); 
    Robolectric.flushForegroundThreadScheduler(); 
Các vấn đề liên quan