2015-07-31 1 views
4

J'ai la situation suivante.Espresso startActivité dépendant de l'intention

Mon activité comporte un fragment dépendant d'un objet sérialisable. Voici mon onCreate:

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

    MyObject myObj = (MyObj) getIntent().getSerializableExtra("myobj"); 

    if(myObj != null) { 
     FragmentManager manager = getSupportFragmentManager(); 
     FragmentTransaction transaction = manager.beginTransaction(); 
     transaction.add(R.id.container, MyFragment.newInstance(myObj)); 
     transaction.commit(); 
    } 
} 

Mais dans mon test Espresso je ne peux tout simplement pas passer l'intention de l'activité avant sa création. J'ai essayé avec setActivityIntent de plusieurs façons, mais je n'arrive pas à comprendre comment le faire fonctionner.

Voici ma dernière tentative:

import android.content.Intent; 
import android.support.test.InstrumentationRegistry; 
import android.support.test.espresso.Espresso; 
import android.test.ActivityInstrumentationTestCase2; 
import org.junit.Before; 

import static android.support.test.espresso.assertion.ViewAssertions.matches; 
import static android.support.test.espresso.matcher.ViewMatchers.withId; 
import static android.support.test.espresso.matcher.ViewMatchers.withText; 

public class MyActivityTest extends 

    ActivityInstrumentationTestCase2<MyActivity> { 

     private MyActivity activity; 
     private MyObject myObj; 

     public MyActivityTest() { 
      super(MyActivity.class); 
     } 

     @Before 
     protected void setUp() throws Exception { 
      super.setUp(); 
      injectInstrumentation(InstrumentationRegistry.getInstrumentation()); 
      myObj = MyObject.mockObject(); 
      Intent i = new Intent(); 
      i.putExtra("myobj", myObj); 
      setActivityIntent(i); 

     } 

     public void testName(){ 
      Espresso.onView(withId(R.id.name)).check(matches(withText(myObj.getObjName()))); 
     } 

    } 

J'ai beaucoup cherché, mais rien ne fonctionne. MyObject est toujours NULL dans le test. Je pense que cela devrait être simple. Qu'est-ce qui me manque?

+0

Quel message d'erreur obtenez-vous? – yogurtearl

+0

vous n'avez pas besoin de @Before, car il s'agit d'un test JUnit 3 et non d'un test JUnit 4. – yogurtearl

+0

Résolu, le problème était avec mon simulacre ... Désolé de déranger. – rafael

Répondre

0

Il ne semble pas que vous démarriez l'activité nulle part. Essayez le getActivity() sur la première ligne de testName().

Ceci lancera l'activité que vous avez passée dans le super constructeur.

+0

J'ai essayé d'appeler 'getActivity()' sur la première ligne de la méthode de test et dans la dernière ligne de 'setUp()' mais ne fonctionnait pas = – rafael

+0

Résolu, le problème était avec mon simulacre ... Désolé de déranger . – rafael

13

Vous pouvez définir l'intention d'utiliser de cette manière

@RunWith(AndroidJUnit4.class) 
public class MyActivityTestTest { 

    private MyObject myObj; 

    @Rule 
    // third parameter is set to false which means the activity is not started automatically 
    public ActivityTestRule<MyActivity> mActivityRule = 
     new ActivityTestRule<>(MyActivity.class, false, false); 


    @Test 
    public void testName() { 

      myObj = MyObject.mockObject(); 
      Intent i = new Intent(); 
      i.putExtra("myobj", myObj); 
      mActivityRule.launchActivity(i); 

     //... 
    } 

} 
0

Vous pouvez remplacer la méthode ActivityTestRule.getActivityIntent() et retourner une intention requise:

@Rule 
public ActivityTestRule<MyActivity> mActivityRule = 
     new ActivityTestRule<MyActivity>(MyActivity.class){ 

    @Override 
    protected Intent getActivityIntent() { 
     Intent intent = new Intent(); 
     intent.putExtra("myobj", myObj); 
     return intent; 
    } 
};