2016-03-16 31 views

risposta

8

Immagino che quello che davvero non vorrete testare sia il vostro codice e se si comporti come desiderato usando questi componenti.

Dal momento che l'ambito della tua domanda è piuttosto ampia, mi permetta di dare un caso d'uso .:

Supponiamo di avere un frammento con un RecyclerView, che ha un LinearLayoutManager. Vuoi testare se un clic su uno degli elementi attiva la chiamata al metodo giusto su un altro livello. (Diciamo che si utilizza MVP e che è il presentatore)

Una possibile prova potrebbe essere la seguente .:

@RunWith(RobolectricGradleTestRunner::class) 
@Config(constants = BuildConfig::class, sdk = intArrayOf(21)) 
class MyFragmentTest { 

lateinit var fragment: MyFragment 
lateinit var activityController: ActivityController<FragmentActivity> 

@Before 
@Throws(Exception::class) 
fun setUp() { 
    fragment = MyFragment() 

    activityController = Robolectric.buildActivity(FragmentActivity::class.java) 

    activityController.create().start().resume() 

    activityController.get() 
      .supportFragmentManager 
      .beginTransaction() 
      .add(fragment, null) 
      .commit() 
} 

@Test 
@Throws(Exception::class) 
fun testClickEntry() { 
    val recycler = fragment.view!!.findViewById(R.id.sideNavigationRecycler) as RecyclerView 
    // workaround robolectric recyclerView issue 
    recycler.measure(0,0) 
    recycler.layout(0,0,100,1000) 

    // lets just imply a certain item at position 0 for simplicity 
    recycler.findViewHolderForAdapterPosition(0).itemView.performClick() 

    // presenter is injected in my case, how this verification happens depends on how you manage your dependencies. 
    verify(fragment.presenter).onEntryClicked(MyNavigationEntry.XYZ) 
} 
} 

Ci scusiamo per la sintassi prima di tutto, io uso Kotlin nel mio test.

Devo dire che non sono soddisfatto al 100% da solo, ma penso che sia ragionevole se non si vuole verificare la corretta comunicazione dei livelli.

+0

Ho usato '.measure' e' .layout' e non funziona prima, ora funziona grazie a – david

+0

.misura e .layout permesso a getAdapterPosition di funzionare correttamente per me – Shooky