【问题标题】:android testing - mockito error org.mockito.exceptions.misusing.WrongTypeOfReturnValue:android 测试 - 模拟错误 org.mockito.exceptions.misusing.WrongTypeOfReturnValue:
【发布时间】:2023-04-05 04:50:01
【问题描述】:

我尝试为我的演示者创建测试,但是当我运行它时,我得到了这种错误

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

这是我要测试的演示者类

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 和 rx android。 因此,如果有人有任何想法,我在代码中做错了什么。请帮帮我

谢谢。

【问题讨论】:

    标签: java android unit-testing mockito mvp


    【解决方案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,并且该方法中没有其他任何内容与模拟交互。如果talkService 是一个mock,那么when(talkService.createNewTalk(/*...*/)) 将存根方法createNewTalk,而是存根最后一个mock 方法调用getContext。这使它看起来像:

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

    ...与您的错误消息完全匹配:

    org.mockito.exceptions.misusing.WrongTypeOfReturnValue: getContext() 无法返回 ScalarSynchronousObservable


    要解决此问题,只需删除您的 talkService 分配,以便 when 方法调用实际上是一个模拟,或者使用您已初始化的真实 talkService 并删除 @Mock 注释和 whenverify 声明。

    【讨论】:

    • 我明白了,谢谢你的帮助,我会先试试你的建议
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-16
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多