我试着为演示者创建测试,但是当我运行它时,我得到了这样的错误
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;
}
});
}
}
在这种情况下,我使用retrofit 2.1.0和rx android。如果有人有任何想法,我在我的代码中做错了什么。请帮帮我
谢谢。
talkService
不是mock。即使你有这样的设置:
@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的when
通过模拟when
调用之前/内部调用的最后一个方法来工作,并且该方法中的其他任何内容都不会与mock交互。如果talkService
是模拟,那么when(talkService.createNewTalk(/*...*/))
将存根createNewTalk
方法,但它会存根最后一个模拟方法调用getContext
。这使得它看起来像:
when(createTalkMvpView.getContext()).thenReturn(Observable.just(talkResultModel));
…与错误信息完全匹配:
org.mockito.exceptions.misusing.WrongTypeOfReturnValue:getContext()不能返回scalarsynchronousoobservable
要解决这个问题,只需删除您的talkService
分配,因此when
方法调用实际上是一个模拟,或使用真正的talkService
,因为您已经初始化它,并删除@Mock
注释和when
和verify
语句。