我是Android测试和使用Espresso的新手。我试图测试当用户点击RecyclerView中的项目时,会显示正确的数据。但是,当我尝试运行测试时,我得到一个空对象引用。任何人都可以帮我解决我做错的事吗?
MyActivity.class
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recipe);
cakeViewModel = ViewModelProviders.of(this).get(CakeViewModel.class);
if (cakeViewModel.cake.getValue() != null) {
cakeViewModel.cake.setValue(null);
}
retrieveData();
}
private void retrieveData() {
cakeViewModel.cake.setValue(null);
mainDb = Realm.getDefaultInstance();
Intent recipeIntent = getIntent();
int cakeId = recipeIntent.getIntExtra(MainActivity.CAKE_ID, 0);
Cake cake = mainDb.where(Cake.class).equalTo("id", cakeId).findFirst();
cakeViewModel.cake.setValue(cake);
getSupportActionBar().setTitle(cake.getName());
}
我的测试:
@RunWith(AndroidJUnit4.class)
public class RecipeActivityUITest {
@Rule
public ActivityTestRule<RecipeActivity> recipeActivityActivityTestRule = new ActivityTestRule<>(RecipeActivity.class);
@Test
public void clickOnRecyclerViewItem_opensRecipeStepActivity() {
onView(withId(R.id.rv_step_list)).check(matches(isDisplayed()));
onView(withId(R.id.rv_step_list)).perform(actionOnItemAtPosition(1, click()));
onView(withId(R.id.vp_step)).check(matches(isDisplayed()));
}
}
我收到以下错误:
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.ciaransloan.bakingapp.api.model.Cake.getName()' on a null object reference
at com.ciaransloan.bakingapp.RecipeActivity.retrieveData(RecipeActivity.java:108)
at com.ciaransloan.bakingapp.RecipeActivity.onCreate(RecipeActivity.java:53)
事实证明我的问题是我没有在我的测试中传递任何意图,因此当它试图加载Object时,它没有从意图中检索ID。毕竟问题与我的数据库无关。为了解决这个问题,我将测试中的@Rule更改为以下内容:
@Rule
public ActivityTestRule<RecipeActivity> recipeActivityActivityTestRule = new ActivityTestRule<RecipeActivity>(RecipeActivity.class) {
@Override
protected Intent getActivityIntent() {
return new Intent(ApplicationProvider.getApplicationContext(), RecipeActivity.class).putExtra(MainActivity.CAKE_ID, 1);
}
};