为什么我的方法在Espresso测试中返回空对象引用?

问题描述 投票:0回答:1

我是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)
android realm android-espresso android-testing
1个回答
0
投票

事实证明我的问题是我没有在我的测试中传递任何意图,因此当它试图加载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);
        }
    };
© www.soinside.com 2019 - 2024. All rights reserved.