2016-11-01 7 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); 
    } 
} 

и Mock результата я использую этот класс

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; 
    } 
} 

и это я S класс ведущего, что я хочу, чтобы проверить

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; 
        } 
       }); 

    } 
} 

Я использую переоснащение 2.1.0 и ПРМ андроид в этом случае. Итак, если у кого-то есть идея, что я делаю неправильно в своем коде. Помогите мне

Спасибо.

ответ

1

talkService не является издевательским. Даже если у вас есть этот набор:

@Mock 
TalkService talkService; 

Вы затем перезаписать его в @Before методе setUp:

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

Так в тесте, это происходит в реальной TalkService реализации:

when(talkService.createNewTalk(/* ... */ 
    )).thenReturn(Observable.just(talkResultModel)); 

Которая затем называет реальный метод 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, и ничто другое в этом методе не взаимодействует с mocks. Если talkService были макетами, то when(talkService.createNewTalk(/*...*/)) заглушил метод createNewTalk, но вместо этого он заглушает последний последний метод вызова getContext. Это делает его выглядеть следующим образом:

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

... который точно соответствует ваше сообщение об ошибке:

org.mockito.exceptions.misusing.WrongTypeOfReturnValue: ScalarSynchronousObservable не может быть возвращен getContext()


Чтобы это исправить, просто удалить talkService назначение так when на самом деле является макетом или использовать реальный talkService, как вы его инициализировали, и удалить аннотацию @Mock и when и verify.

+0

Я вижу, Спасибо за помощь Я попробую ваше предложение сначала – cakduro

 Смежные вопросы

  • Нет связанных вопросов^_^