Утверждение представлений с использованием Espresso на основе значения onChanged Observers - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть действие MyActivity, которое реализует наблюдателя и слушает, когда myNumber было изменено.

Когда myNumber изменяется, MyActivity должен вызывать метод onChanged(...) и затем основываться напереданный аргумент number измените fragment_container, чтобы показать конкретный фрагмент.

Я хочу написать простой тест с использованием Espresso, чтобы убедиться, что при вызове onChanged(1) утверждается, что FragmentB включенпредставление.

public class MyActivity extends AppCompatActivity
    implements Observer<Integer> {

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    mViewModel = ViewModelProviders.of(this).get(MyActivity.class);
    mViewModel.myNumber.observe(this, this);
  }

  @Override
  public void onChanged(Integer number) {
    Fragment fragment = null;

    // Choose a fragment based on the returned number
    switch(number) {
      case 0:
        fragment = new FragmentA();
        break;
      case 1:
        fragment = new FragmentB();
        break;
      ...
    }

    // Add the fragment to activity
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.replace(R.id.fragment_container, fragment);
    ft.commitNowAllowingStateLoss();   
  }

  ... 
}

ViewModel выглядит

public class MyViewModel extends AndroidViewModel {
  public MutableLiveData<Integer> myNumber = new MutableLiveData<>();

  public void changeNumber(Integer num) {
    myNumber.postValue(num)
  }
}

Что я пробовал до сих пор ...

@Test
public void assertFragmentB throws Throwable {
    final TestLifecycleOwner lifecycleOwner = new TestLifecycleOwner();
    lifecycleOwner.handleEvent(Lifecycle.Event.ON_START);

    final TestObserver<Integer> observer = new MyActivityTest.MyTestObserver<>();

    MutableLiveData<Integer> liveData = postNextStepValue(1);
    Espresso.onIdle();
    TestUtil.observeOnMainThread(liveData, lifecycleOwner, observer);

    Integer num = observer.get();
    assertEquals(1, num);  // This works!

    onView(withId(R.id.fragment_b))
        .check(matches(isDisplayed()));  // This does not work
}

// Below functions were examples I copied from Google...
private void drain() throws TimeoutException, InterruptedException {
    mExecutorRule.drainTasks(1, TimeUnit.MINUTES);
}

private class MyTestObserver<T> extends TestObserver<T> {
    @Override
    protected void drain() throws TimeoutException, InterruptedException {
      MyActivity.this.drain();
    }
}

Ошибка

E/TestRunner: java.lang.RuntimeException: No activities found. Did you forget to launch the activity by calling getActivity() or startActivitySync or similar?
...