Привет Джефф Боуман и пользователь 8035311,
Первое. Большое спасибо за ваши быстрые ответы.
Во-вторых, у меня было мало времени, поэтому я не мог опубликовать свой код.
Чтобы ответить на мой вопрос, мне пришлось реорганизовать мой код и уменьшить связь между классами (мой плохой).
Итак, позвольте мне показать вам противоречивую часть:
@Override
public void onResponse(final PresentationModel presentationModel) {
presentationModelWrapper.clear();
presentationModelWrapper.add(presentationModel);
if(isViewAttached()){
final SomeHandler someHandler = view.getSomeHandler();
someHandler.execute(new Runnable() {
@Override
public void run() {
//some code here
}
});
}
}
Когда выполнение someHandler заканчивается, я вызываю функцию обратного вызова, которая вызывает метод докладчика.
Теперь позвольте мне показать вам мое решение:
@Mock
private SomeContract.View view;
@Mock
private SomeHandler someHandler;
@Captor
private ArgumentCaptor<SomeCallback> somethingCallbackArgumentCaptor;
@InjectMocks
private SomePresenter presenter;
@Test
public void loadSomething_shouldShowSomething() {
// Given
Map<String, String> parameters = new HashMap<String, String>();
parameters.put(Constant.API_PARAMETER_QUERY, CUSTOM_QUERY);
// Given a stubbed model
model = new PresentationModel();
//when
presenter.loadSomething(parameters);
//This part mock the someInteractor call
when(view.getSomeHandler()).thenReturn(someHandler);
verify(someInteractor).execute(anyMap(), somethingCallbackArgumentCaptor.capture());
somethingCallbackArgumentCaptor.getValue().onResponse(model);
//we are on response my conflictive part
verify(someHandler).execute(any(Runnable.class));
//I use presenter instead of ArgumentCaptor because handler has a presenter reference
presenter.onDatabaseOperationFinished();
// Then
SomethingUI uiModel = presenter.getUiModel();
verify(view).showSomething(uiModel);
}
Я очень надеюсь, что это кому-нибудь пригодится.
Франциско.