2015-07-31 2 views
4

У меня есть следующая ситуация.Espresso startActivity, который зависит от намерения

В моей деятельности есть фрагмент, который зависит от объекта Serializable. Вот мой 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(); 
    } 
} 

Но в моем тесте Эспрессо я просто не могу передать намерение деятельности, прежде чем он создан. Я попытался с setActivityIntent несколькими способами, но не могу понять, как заставить его работать.

Вот моя последняя попытка:

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()))); 
     } 

    } 

Я искал много, но ничего не работает. MyObject всегда имеет значение null в тесте. Я думаю, это должно быть просто. Что мне не хватает?

+0

Какую ошибку вы получаете? – yogurtearl

+0

вам не нужно @ Прежде, потому что это тест JUnit 3, а не тест JUnit 4. – yogurtearl

+0

Решенный, проблема была в моей манере ... Извините, что беспокоиться. – rafael

ответ

0

Не похоже, что вы фактически начинаете свою деятельность в любом месте.

Попробуйте позвонить getActivity() в первой строке testName().

Это запустит действие, которое вы передали в супер конструктор.

+0

Я попытался вызвать 'getActivity()' в первой строке метода тестирования и в последней строке 'setUp()', но не работал =/ – rafael

+0

Решен, проблема была в моем макете ... Извините, что беспокоилась , – rafael

13

Вы можете определить Intent, который будет использоваться таким образом

@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

Вы можете переопределить метод ActivityTestRule.getActivityIntent() и вернуть требуемую Намерение:

сообщение
@Rule 
public ActivityTestRule<MyActivity> mActivityRule = 
     new ActivityTestRule<MyActivity>(MyActivity.class){ 

    @Override 
    protected Intent getActivityIntent() { 
     Intent intent = new Intent(); 
     intent.putExtra("myobj", myObj); 
     return intent; 
    } 
}; 
Смежные вопросы