Wie man eine Methode vortäuscht, die Callback-Objekt und Aufrufer dieser Methode verwendet, um Ergebnisse an andere Callbacks zu delegieren. Hier in meinem Szenario erstelle ich Rx Single daraus.Wie man eine Methode vortäuscht, die Callback-Objekt und Aufrufer verwendet, Callback verwenden, um Ergebnis zu delegieren
1. RecentDataModel.java
public class RecentDataModel {
public void getRecentData(RecentDataAdapter recentDataAdapter) {
// Get data from database
// Invoke if success
recentDataAdapter.onSuccess()
// Invoke if error
recentDataAdapter.onError()
}
}
2. RecentDataAdapter.java
public class RecentDataAdapter {
onSuccess(List<String> recents);
onError();
}
3. RecentPresenter
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. RecentTestCase
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");
}
}
Hinweis:
keinen Zugang zu RecentDataModel hat und daher keine neuen Verfahren wie einführen können:
List<String> getRecentData();
Obwohl Verfahren ResentPresenter.getRecentsSingle() macht keine Geschäftslogik. Aber es wird mit anderen Methoden in der Klasse verbunden, um die Ausgabe zu erzeugen. Also verspotten RecentDataModel ist notwendig.
-Test wird in folgenden Zeile
"verify(onNextListener, timeout(5000)).call(listCaptor.capture());"
scheitern, weil während spöttisch ich bin Bereitstellungany(RecentDataAdapter.class)
aufgrund dersingleSubscriber.onSuccess(keywordList);
nie aufgerufen wird.
Bitte lassen Sie mich wissen, wenn Sie weitere Informationen über diese benötigt. –