2016-11-01 31 views
0

は、私は私のプレゼンターのためのテストを作成しようが、私はそれを実行したとき、私は私のプレゼンターを作成アンドロイドテスト - mockitoエラーorg.mockito.exceptions.misusing.WrongTypeOfReturnValue:

org.mockito.exceptions.misusing.WrongTypeOfReturnValue: 
ScalarSynchronousObservable cannot be returned by getContext() 
getContext() should return Context 

この種のエラーを得ましたこの

public class CreateTalkPresenterTest { 

    @Mock 
    TalkService talkService; 

    @Mock 
    CreateTalkMvpView createTalkMvpView; 

    CreateTalkPresenter createTalkPresenter; 

    @Before 
    public void setUp() throws Exception { 
     MockitoAnnotations.initMocks(this); 
     talkService = ServiceFactory.createMapi(createTalkMvpView.getContext(), TalkService.class); 
     createTalkPresenter = new CreateTalkPresenter(Schedulers.immediate(), Schedulers.immediate()); 
     createTalkPresenter.attachView(createTalkMvpView); 
    } 

    @Test 
    public void createTalkSuccessfullTest() { 
     TalkService.TalkResultModel talkResultModel = MockModel.newTalkResultModel(); 

     when(talkService.createNewTalk(
       FileUtil.createPartFromString("Lorem Ipsum dolor"), 
       FileUtil.createPartFromString("100"), 
       null, 
       FileUtil.createPartFromString("0") 
     )).thenReturn(Observable.just(talkResultModel)); 

     createTalkPresenter.callCreateTalk("Lorem Ipsum dolor", "100", null); 

     verify(createTalkMvpView).showProgressIndeterminate(); 
     verify(createTalkMvpView).hideProgressIndeterminate(); 
     verify(createTalkMvpView).showTalkCreated(talkResultModel.object); 
    } 
} 

とモック私は

public class MockModel { 

    public static TalkService.TalkResultModel newTalkResultModel(){ 
     TalkService.TalkResultModel talkResultModel = new TalkService.TalkResultModel(); 
     talkResultModel.code = 600; 
     talkResultModel.message = "Successfully executed!"; 
     talkResultModel.object = newTalkModel(); 

     return talkResultModel; 
    } 

    public static TalkModel newTalkModel(){ 
     Random random = new Random(); 
     String index = String.valueOf(random.nextInt(100)); 
     TalkModel talkModel = new TalkModel(); 
     talkModel.id = index; 
     talkModel.content = "Lorem Ipsum dolor"; 
     talkModel.categorytalk = newCategoryTalkModel("Category "+index); 
     talkModel.creator = newConsumerModel("User "+index); 
     return talkModel; 
    } 

    public static CategoryTalkModel newCategoryTalkModel(String name){ 
     CategoryTalkModel categoryTalkModel = new CategoryTalkModel(); 
     categoryTalkModel.id = "100"; 
     categoryTalkModel.name = name; 
     return categoryTalkModel; 
    } 

    public static ConsumerModel newConsumerModel(String name){ 
     Random random = new Random(); 
     String index = String.valueOf(random.nextInt(100)); 
     ConsumerModel consumerModel = new ConsumerModel(); 
     consumerModel.id = index; 
     consumerModel.username = name; 
     consumerModel.email = name+"@domain.com"; 
     consumerModel.fullName = "Fullname "+name; 
     return consumerModel; 
    } 
} 

そして、この私、このクラスを使用した結果のためのようなテストクラス私がテストしたい発表者のクラス

public class CreateTalkPresenter implements Presenter<CreateTalkMvpView> { 

    private CreateTalkMvpView createTalkMvpView; 
    private TalkService mApiTalkService; 
    private TalkService.TalkResultModel talkResultModel; 
    private final Scheduler mainScheduler, ioScheduler; 

    private Subscription subscription; 

    public CreateTalkPresenter(Scheduler ioScheduler, Scheduler mainScheduler) { 
     this.ioScheduler = ioScheduler; 
     this.mainScheduler = mainScheduler; 
    } 

    @Override 
    public void attachView(CreateTalkMvpView view) { 
     createTalkMvpView = view; 
    } 

    @Override 
    public void detachView() { 
     createTalkMvpView = null; 
     unsubscribe(); 
    } 

    private void unsubscribe() { 
     if (subscription != null) subscription.unsubscribe(); 
    } 

    public void callCreateTalk(String content, String categoryId, String filePath) { 
     mApiTalkService = ServiceFactory.createMapi(createTalkMvpView.getContext(), TalkService.class); 

     unsubscribe(); 
     createTalkMvpView.showProgressIndeterminate(); 
     subscription = mApiTalkService.createNewTalk(
       FileUtil.createPartFromString(content), 
       FileUtil.createPartFromString(categoryId), 
       filePath != null ? FileUtil.prepareFilePart("picture", new File(filePath)) : null, 
       FileUtil.createPartFromString("0")) 
       .observeOn(mainScheduler) 
       .subscribeOn(ioScheduler) 
       .subscribe(new Subscriber<TalkService.TalkResultModel>() { 
        @Override 
        public void onCompleted() { 
         createTalkMvpView.hideProgressIndeterminate(); 
         createTalkMvpView.showTalkCreated(talkResultModel.object); 
        } 

        @Override 
        public void onError(Throwable e) { 
         createTalkMvpView.hideProgressIndeterminate(); 
         WarningUtil.onApiError(createTalkMvpView.getContext(), 0, e.getMessage()); 
        } 

        @Override 
        public void onNext(TalkService.TalkResultModel talkResultModel) { 
         CreateTalkPresenter.this.talkResultModel = talkResultModel; 
        } 
       }); 

    } 
} 

この場合、私はretrofit 2.1.0とrx androidを使用しています。 誰かが考えていると、自分のコードで何が間違っているのでしょうか。助けてください

ありがとうございます。

答えて

1

talkServiceはモックではありません。あなたはこのセット持っているにもかかわらず:

when(talkService.createNewTalk(/* ... */ 
    )).thenReturn(Observable.just(talkResultModel)); 
:だからあなたのテストでは、これが本当の TalkService実装に起こる

talkService = ServiceFactory.createMapi(createTalkMvpView.getContext(), TalkService.class); 

@Mock 
TalkService talkService; 

を次に、あなたの@Before方法setUpでそれを上書き

これは次にcreateNewTalkという実メソッドを呼び出します。これは

で始まります
mApiTalkService = ServiceFactory.createMapi(
    createTalkMvpView.getContext(), TalkService.class); 

Mockito's when works by mocking the last method that was called before/within the call to whenと他の方法はモックと相互作用しないため、残りのメソッドは重要ではありません。 talkServiceがモックだった場合、when(talkService.createNewTalk(/*...*/))はメソッドcreateNewTalkをスタブしますが、最後のモックメソッドの呼び出しはgetContextをスタブします。

org.mockito.exceptions.misusing.WrongTypeOfReturnValue: ScalarSynchronousObservableはのgetContextで返すことができない()

正確にあなたのエラーメッセージに一致する

when(createTalkMvpView.getContext()).thenReturn(Observable.just(talkResultModel)); 

...:これは、ように見えますちょうどのでごtalkService割り当てを削除、これを修正するには


10メソッド呼び出しは実際には模擬です。つまり、talkServiceを初期化して@Mockアノテーションとwhenverifyというステートメントを削除してから、実際にはtalkServiceを使用してください。

+0

私は、 あなたの助けをありがとう 私はあなたの提案を最初に試してみる – cakduro