2017-02-06 2 views
3

J'ai une base RecyclerViewAdapter Je veux tester isolément de mes différentes classes d'enfants. Comment puis-je faire cela en isolation? J'ai essayé de créer une activité vanille amincie dans ma classe de test, et en utilisant ActivityTestRule pour le lancer, mais malheureusement, le framework de test semble vouloir lancer des activités qui vivent dans l'application actuelle et non dans l'application de test. Je ne veux pas avoir recours à Robolectric pour cela, car notre équipe s'est engagée à tester les instruments en utilisant Espresso. Ce que je veux vraiment tester est le comportement des différentes méthodes notify dans l'adaptateur, car je vois percuterTest des adaptateurs RecyclerView

android.support.v7.widget.RecyclerView $ Recycler.validateViewHolderForOffsetPosition

+0

Je pense que vous devez fournir du code. Dans la forme actuelle, c'est trop vague (du moins pour moi). –

+0

Voir ma réponse. J'espère que cela pourra aider. –

Répondre

3

J'ai fini par résoudre cela en ajoutant une activité fictive dans le dossier debug, puis dans mon code de test en ajoutant manuellement un RecyclerView à l'activité, puis en définissant l'adaptateur que je veux tester de manière isolée. Lorsque l'application compile la fusion manifeste fusionnera toutes les activités déclarées dans le AndroidManifest.xml qui vivent dans le dossier de débogage.

Voici mon test de code de configuration:

@RunWith(AndroidJUnit4.class) 
public class MyRecyclerViewAdapterTest { 

    private MyRecyclerViewAdapter adapter; 
    private RecyclerView recyclerView; 

    @Rule 
    public ActivityTestRule<DummyActivity> activityTestRule = 
     new ActivityTestRule<>(DummyActivity.class, true, false); 

    @Rule 
    public UiThreadTestRule uiThreadTestRule = new UiThreadTestRule(); 

    @Before 
    public void setup() throws Throwable { 
     final DummyActivity activity = activityTestRule.launchActivity(null); 

     uiThreadTestRule.runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       adapter = new MyRecyclerViewAdapter(activity); 
       recyclerView = new RecyclerView(activity); 
       recyclerView.setId(R.id.recycler_view); 
       activity.setContentView(recyclerView); 
       recyclerView.setLayoutManager(new LinearLayoutManager(activity)); 
       recyclerView.setAdapter(adapter); 
      } 
     }); 
    } 
} 

et a déclaré l'activité factice dans /src/debug/AndroidManifest.xml:

<activity android:name="com.example.DummyActivity" /> 

L'activité fictive est simplement:

// Dummy Activity for testing 
public class DummyActivity extends Activity { 
}