пример использования анонимного класса Runnable, который применяет изменения в Outterclass? - PullRequest
0 голосов
/ 29 июня 2018

В моем проекте android, в моем докладчике, я запускаю один фоновый поток в анонимном классе Runnable, который применяет изменения в члене класса докладчика. Когда поток заканчивается, он вызывает обратный вызов. У кого-нибудь есть пример насмешки над анонимным классом Runnable, который применяет изменения во внешнем классе?

1 Ответ

0 голосов
/ 01 июля 2018

Привет Джефф Боуман и пользователь 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);
  }

Я очень надеюсь, что это кому-нибудь пригодится.

Франциско.

...