如何模拟接听回调对象并调用的方法使用回调来委派结果



如何模拟一个采用回调对象的方法并使用此方法调用将其委托给其他回调。在我的情况下,我正在从中创建RX单。

1。最近的datamodel.java

public class RecentDataModel {
public void getRecentData(RecentDataAdapter recentDataAdapter) {
    // Get data from database
    // Invoke if success
    recentDataAdapter.onSuccess()
    // Invoke if error
    recentDataAdapter.onError()
}
}

2。最近的dataadapter.java

public class RecentDataAdapter {
    onSuccess(List<String> recents);
    onError();
}

3。最近的Presenter

public class RecentPresenter {
public Single<List<String>> getRecentsSingle() {
    return Single.create(new Single.OnSubscribe<List<String>>() {
            @Override
            public void call(final SingleSubscriber<? super List<String>> singleSubscriber) {
                mRecentDataModel.getRecentData(new RecentDataAdapter() {
                    @Override
                    public void onSuccess(List<String> keywordList) {
                        singleSubscriber.onSuccess(keywordList);
                    }
                });
            }
        });
}
}

4。最近的案件

public class RecentPresenterTest {
    @Mock
    RecentDataModel recentModel;
    @Test
    public void testLoadRecent() {
        doAnswer(new Answer() {
            @Override
            public List<String> answer(InvocationOnMock invocation) throws Throwable {
                List<String> recents = new ArrayList<>();
                recents.add("Recent1");
        recents.add("Recent2");
                return recents;
            }
        }).when(recentModel).getRecentData(any(RecentDataAdapter.class));
        RecentPresenter recentProvider = new RecentPresenter(null, null, prefModel);
        Action1 onNextListener = mock(Action1.class);
        recentProvider.getRecentsSingle.subscribe(onNextListener);
        ArgumentCaptor<List<String>> listCaptor = ArgumentCaptor.forClass((Class) List.class);
        verify(onNextListener, timeout(5000)).call(listCaptor.capture());
        assertNotNull(listCaptor.getValue());
        assertEquals(listCaptor.getValue().get(0), "Recent1");
    }
}

注意:

  1. 无法访问最近的datamodel,因此无法引入新方法:List<String> getRecentData();

  2. 尽管方法ResentPresenter.getRencentssingle()没有执行任何业务逻辑。但是它与同类中的其他方法连接以产生输出。因此,嘲笑最近的datamodel是必要的。

  3. 测试在以下线"verify(onNextListener, timeout(5000)).call(listCaptor.capture());"中失败,因为在嘲笑时,我正在提供any(RecentDataAdapter.class),因为singleSubscriber.onSuccess(keywordList);永远不会被调用。

问题是您不会在适配器上调用回调。由于从未调用回调,因此Single.success从未被调用。因此,Single未通知到发出的列表。然后您的验证超时。

要解决该问题,您必须在模拟中调用onSuccess回调方法:

  doAnswer(new Answer() {
        @Override
        public Void answer(InvocationOnMock invocation) throws Throwable {
            List<String> recents = new ArrayList<>();
            recents.add("Recent1");
            recents.add("Recent2");
            invocation.getArguments()[0].onSuccess(recents);
            return null;
        }
 }).when(recentModel).getRecentData(any(RecentDataAdapter.class));

相关内容

  • 没有找到相关文章

最新更新