2016-09-27 16 views
5

Tôi muốn tạo thử nghiệm cho lớp Trình bày của mình nhưng tôi đang gặp sự cố với cá thể CompositeSubscription bên trong chính Trình bày. Khi tôi chạy thử nghiệm tôi nhận được lỗi này:Kiểm tra đơn vị trình bày với RxJava CompositeSubscription

java.lang.NullPointerException 
at rx.subscriptions.CompositeSubscription.add(CompositeSubscription.java:60) 
at com.example.Presenter.addSubscription(Presenter.java:67) 
at com.example.Presenter.getGummyBears(Presenter.java:62) 

Đây là khoảng lớp học của tôi trình bày:

public class Presenter { 

    CompositeSubscription compositeSubscription = new CompositeSubscription(); 
    //creation methods... 

    public void addSubscription(Subscription subscription) { 
     if (compositeSubscription == null || compositeSubscription.isUnsubscribed()) { 
      compositeSubscription = new CompositeSubscription(); 
     } 
     compositeSubscription.add(subscription); 
    } 

    public void getGummyBears() { 
     addSubscription(coreModule.getGummyBears()); 
    } 
} 

Các CoreModule là một giao diện (một phần của một mô-đun khác nhau) và có là một lớp CoreModuleImpl khác trong đó có tất cả các cuộc gọi API trang bị thêm và chuyển đổi của chúng thành Đăng ký. Cái gì như:

@Override public Subscription getGummyBears() { 
    Observable<GummyBears> observable = api.getGummyBears(); 
    //a bunch of flatMap, map and other RxJava methods 
    return observable.subscribe(getDefaultSubscriber(GummyBear.class)); 

    //FYI the getDefaultSubscriber method posts a GummyBear event on EventBus 
} 

Bây giờ những gì tôi muốn làm là để thử nghiệm các phương pháp getGummyBears(). phương pháp thử nghiệm của tôi trông như thế này:

@Mock EventBus eventBus; 
@Mock CoreModule coreModule; 
@InjectMock CoreModuleImpl coreModuleImpl; 

private Presenter presenter; 

@Before 
public void setUp() { 
    presenter = new Presenter(coreModule, eventBus); 
    coreModuleImpl = new CoreModuleImpl(...); 
} 


@Test 
public void testGetGummyBears() { 
    List<GummyBears> gummyBears = MockBuilder.newGummyBearList(30); 

    //I don't know how to set correctly the coreModule subscription and I'm trying to debug the whole CoreModuleImpl but there are too much stuff to Mock and I always end to the NullPointerException 

    presenter.getGummyBears(); //I'm getting the "null subscription" error here 
    gummyBears.setCode(200); 

    presenter.onEventMainThread(gummyBears); 
    verify(gummyBearsView).setGummyBears(gummyBears); 
} 

Tôi đã thấy nhiều ví dụ thử nghiệm từ các dự án khác nhau nhưng không ai đang sử dụng phương pháp đăng ký này. Họ chỉ trả lại Observable được tiêu thụ trực tiếp bên trong người trình bày. Và trong trường hợp đó, tôi biết cách viết một bài kiểm tra.

Cách chính xác để kiểm tra tình huống của tôi là gì?

+0

Bạn có trình bày lấy 'CoreModule' trong hàm tạo không? – skywall

+0

yep xin lỗi tôi quên thêm dòng này 'presenter = new Presenter (coreModule, eventBus) 'trong phương thức' setUp' – nicopasso

+0

hi @nicopasso bạn có thể tìm cách giải quyết nó không? –

Trả lời

1

Có vẻ như coreModule.getGummyBears() đang trả về giá trị rỗng. Chỉ cần bước qua với gỡ lỗi và nó phải được khá rõ ràng. Khi sử dụng các khuôn khổ mocking, bạn có thể nhận được null trả về từ các cuộc gọi phương thức trên một đối tượng giả lập khi bạn chưa chỉ định những gì mà lời gọi phương thức sẽ trả về đối tượng được giả định đó.

+0

Thực ra mã này phức tạp hơn nhiều so với mã tôi viết trong câu hỏi. Lớp "coreModule" là một giao diện và có một lớp "coreImpl" khác thực hiện giao diện này. Tôi đã cập nhật câu hỏi của mình theo cấu trúc dự án của tôi. – nicopasso

0

Như Dave đã đề cập, bạn cần giả lập giá trị trả lại là CoreModule.getGummyBears. Một điều lạ là bạn không sử dụng CoreModuleImpl đang được tạo. Thay vào đó, bạn đang chuyển coreModule đến hàm tạo của người trình bày.

Bạn có thể thử getGummyBears() bằng cách làm một cái gì đó như thế này:

when(coreModule.getGummyBears()).thenReturn(MockBuilder.newGummyBearList(30); 

Sau đó, các lỗi cụ thể mà bạn đang gặp phải nên được giải quyết. Có vẻ như bạn không cần CoreModuleImpl cho trường hợp kiểm tra cụ thể này.