0

私はEspressoが初めてで、インスタンス化時にRetrofit呼び出しを行うフラグメントをテストしようとしています。コールが受信されると、ビューが存在するかどうかを確認するためにフラグメントをチェックします。私は断片化のためにIdlingResourceを使用しており、レスポンスが受信されたときにResourceCallbackをアイドル状態に遷移させるリスナーを設定しています(実装のいくつかの手順に従う:https://stackoverflow.com/a/30820189/4102823)。エスプレッソのIdlingResource with Retrofit 2

私のフラグメントは、ユーザーがログインしてMainActivityを起動するとインスタンス化されます。問題は、私のIdlingResourceが正しく設定されているとは思っていないことです。私はIdlingResourceの何が問題なのか分かりません。テストのsetUp()メソッドにIdlingResourceメソッドを他のものよりも前に登録しているにもかかわらず、フラグメントが開始されて呼び出しが行われるまで構築されません。だから、ここでの主な問題は、IdlingResourceがテストを実行するときにフラグメントの横にインスタンス化される方法です。 @Ruleに問題がありますか?テストがフラグメントで実行される前に、MainActivity(NewsfeedFragmentインスタンスを作成する)を開始しますか?もしそうなら、代わりに私のフラグメントにルールを使用する方法はありますか?ここ

は私の断片である:

public ProgressListener mProgressListener; 
public boolean mIsProgressShown = true; 

public interface ProgressListener { 
    void onProgressShown(); 
    void onProgressDismissed(); 
} 

public void setProgressListener(ProgressListener progressListener) { 
    mProgressListener = progressListener; 
} 

public NewsfeedFragment() { 
} 

public static NewsfeedFragment newInstance() { 
    return new NewsfeedFragment(); 
} 

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

    OSUtil.setTranslucentStatusBar(getActivity().getWindow(), this.getContext()); 
} 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    mRootView = (SwipeRefreshLayout) inflater.inflate(R.layout.fragment_newsfeed, container, false); 
    mNewsfeedFramelayout = (FrameLayout) mRootView.findViewById(R.id.newsfeed_framelayout); 
    mProgressView = (ProgressBar) mRootView.findViewById(R.id.newsfeed_progress); 
    mPageIndictorView = (FrameLayout) mRootView.findViewById(R.id.page_indicator); 
    mPageIndicator = (TextView) mRootView.findViewById(R.id.page_indicator_text); 
    mRootView.setOnRefreshListener(this); 

    // Set up the ViewPager with the sections adapter. 
    mViewPager = (ViewPager) mRootView.findViewById(R.id.newsfeed_viewpager); 
    mPageChangeListener = this; 

    if (savedInstanceState != null) { 
     mTabPosition = savedInstanceState.getInt(EXTRA_TAB_POSITION); 
     mViewPager.setCurrentItem(mTabPosition); 
    } 

    fetchNewsFeed(); 

    return mRootView; 
} 

private void fetchNewsFeed() { 
    if (NetworkUtils.isConnectedToInternet(getActivity())) { 
     if (NetworkUtils.getService() != null) { 
      if (mRootView.isRefreshing()) { 
       dismissProgress(); 
      } else { 
       showProgress(); 
      } 
      showProgress(); 

      Call<Newsfeed> call = NetworkUtils.getService().getNewsfeed(); 
      call.enqueue(new Callback<Newsfeed>() { 
       @Override 
       public void onResponse(Call<Newsfeed> call, Response<Newsfeed> response) { 
        if (response.isSuccessful()) { 

         dismissProgress(); 
         mNewsfeed = response.body(); 
         FragmentManager fragmentManager = getChildFragmentManager(); 
         mNewsfeedPagerAdapter = new NewsfeedPagerAdapter(fragmentManager, mNewsfeed.getNewsfeedItems()); 
} 

... 


    private void showProgress() { 
     // show the progress and notify the listener 
     if (mProgressListener != null){ 
      setProgressIndicatorVisible(true); 
      notifyListener(mProgressListener); 
     } 
    } 

    public void dismissProgress() { 
     // hide the progress and notify the listener 
     if (mProgressListener != null){ 
      setProgressIndicatorVisible(false); 
      mIsProgressShown = false; 
      notifyListener(mProgressListener); 
     } 
    } 

    public boolean isInProgress() { 
     return mIsProgressShown; 
    } 

    private void notifyListener(ProgressListener listener) { 
     if (listener == null){ 
      return; 
     } 
     if (isInProgress()){ 
      listener.onProgressShown(); 
     } 
     else { 
      listener.onProgressDismissed(); 
     } 
    } 

ここIdlingResourceである:

public class ProgressIdlingResource implements IdlingResource, NewsfeedFragment.ProgressListener { 

private ResourceCallback mResourceCallback; 
private NewsfeedFragment mNewsfeedFragment; 


public ProgressIdlingResource(NewsfeedFragment fragment) { 
    mNewsfeedFragment = fragment; 
    mNewsfeedFragment.setProgressListener(this); 
} 

@Override 
public String getName() { 
    return "ProgressIdlingResource"; 
} 

@Override 
public boolean isIdleNow() { 
    return !mNewsfeedFragment.mIsProgressShown; 
} 

@Override 
public void registerIdleTransitionCallback(ResourceCallback callback) { 
    mResourceCallback = callback; 
} 

@Override 
public void onProgressShown() { 

} 

@Override 
public void onProgressDismissed() { 
    if (mResourceCallback == null) { 
     return; 
    } 
    //Called when the resource goes from busy to idle. 
    mResourceCallback.onTransitionToIdle(); 
} 
} 

フラグメントテスト:

public class NewsfeedFragmentTest { 
@Before 
public void setUp() throws Exception { 
    Espresso.registerIdlingResources(new ProgressIdlingResource((NewsfeedFragment) MainActivity.getCurrentFragment())); 
} 

@Rule 
public ActivityTestRule<MainActivity> mActivityTestRule = new ActivityTestRule<>(MainActivity.class); 

@Test 
public void getViewPager() throws Exception { 
    onView(allOf(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE), 
      withId(R.id.newsfeed_viewpager))).check(matches(isDisplayed())); 
} 

@Test 
public void getNewsfeedItems() throws Exception { 
    onView(withId(R.id.page_indicator)).check(matches(isDisplayed())); 
} 

}

答えて

1

レトロフィットがOkHttp使用され、そして駅がありますIdlingResourceをセットアップするための方法はありません。 OkHttp IdlingResource

を参照してください。
関連する問題