2016-04-12 20 views
5

Tôi đang cố gắng kiểm tra lớp này trong một bài kiểm tra JUnit tiêu chuẩn, tuy nhiên, tôi đang bị treo lên trên một NullPointerException với Schedulers.io(). Có thể Schedulers.io() được chế nhạo không?RxJava Schedules.io() NullPointerException trong bài kiểm tra đơn vị

Đây là ứng dụng Android và tôi đang cố gắng cung cấp toàn bộ phạm vi mã bằng cách sử dụng travis-ci để tích hợp liên tục và coveralls.io để báo cáo mức độ phù hợp.

Class để được Tested:

public class GetLiveStreamsList extends UseCase { 

    private final String filename; 
    private final ContentRepository contentRepository; 

    public GetLiveStreamsList(final String filename, final ContentRepository contentRepository, ThreadExecutor threadExecutor, PostExecutionThread postExecutionThread) { 
     super(threadExecutor, postExecutionThread); 

     this.filename = filename; 
     this.contentRepository = contentRepository; 

    } 

    @Override 
    protected Observable buildUseCaseObservable() { 

     Action1<List<LiveStreamInfo>> onNextAction = new Action1<List<LiveStreamInfo>>() { 

      @Override 
      public void call(List<LiveStreamInfo> liveStreamInfos) { 

       try { 
        Thread.sleep(5000); 
       } catch(InterruptedException e) { } 

      } 

     }; 

     return this.contentRepository.liveStreamInfos(this.filename) 
       .repeat(Schedulers.io()) 
       .doOnNext(onNextAction); 
    } 

} 

thử nghiệm Class:

public class GetLiveStreamsListTest { 

    private static final String FAKE_FILENAME = "fake filename"; 

    private GetLiveStreamsList getLiveStreamsList; 

    @Mock 
    private ThreadExecutor mockThreadExecutor; 

    @Mock 
    private PostExecutionThread mockPostExecutionThread; 

    @Mock 
    private ContentRepository mockContentRepository; 

    @Before 
    public void setUp() { 

     MockitoAnnotations.initMocks(this); 
     getLiveStreamsList = new GetLiveStreamsList(FAKE_FILENAME, mockContentRepository, mockThreadExecutor, mockPostExecutionThread); 

    } 

    @Test 
    public void testGetLiveStreamsListUseCaseObservableHappyCase() { 

     getLiveStreamsList.buildUseCaseObservable(); 

     verify(mockContentRepository).liveStreamInfos(FAKE_FILENAME); 
     verifyNoMoreInteractions(mockContentRepository); 
     verifyZeroInteractions(mockThreadExecutor); 
     verifyZeroInteractions(mockPostExecutionThread); 

    } 

} 

Đây là stacktrace:

java.lang.NullPointerException 
    at org.mythtv.android.domain.interactor.GetLiveStreamsList.buildUseCaseObservable(GetLiveStreamsList.java:47) 
    at org.mythtv.android.domain.interactor.GetLiveStreamsListTest.testGetLiveStreamsListUseCaseObservableHappyCase(GetLiveStreamsListTest.java:48) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:300) 
    at org.junit.runner.JUnitCore.run(JUnitCore.java:157) 
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69) 
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:234) 
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:74) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) 


Process finished with exit code 255 
+0

Bạn có thể đăng stack trace? – zsxwing

+0

@zsxwing Tôi đã thêm stacktrace. Đây là bài kiểm tra duy nhất của tôi hoạt động theo cách này. Một cái tương tự khác không làm điều này. Tôi tin rằng nó đã làm với schedulers.io() trong vòng lặp(). Các tìm kiếm khác cho thấy tôi nên sử dụng schedulers.immediate(), tuy nhiên, khi chạy ứng dụng, điều đó sẽ thổi lên. – dmfrey

+0

Vâng, nếu bạn có các trình mô phỏng luồng mô phỏng, bạn mong đợi việc thực thi thực sự xảy ra như thế nào? Chỉ cần chuyển đổi một bài kiểm tra tích hợp bao gồm các chủ đề thực tế ... –

Trả lời

2

Bạn quên thiết lập giá trị trở lại của contentRepository.liveStreamInfos. Đó là null theo mặc định.

Bạn cần phải thiết lập các giá trị trả về như thế này:

when(contentRepository.liveStreamInfos()).thenReturn(...); 
+0

Cảm ơn. Tôi đã tái cấu trúc điều này để loại bỏ sự cần thiết lặp lại cuộc gọi. – dmfrey

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