У меня есть действие 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?