使用Espresso进行测试并模拟dataSource失败

时间:2016-10-03 09:42:12

标签: android android-espresso android-testing

我的应用中有一个按钮,当用户点击i时,它会显示一个文本。现在我想用Espresso测试它。

MainActivity中的代码是:

public void onButtonGetDataClick(View view) {
    mainPresenter.onButtonClick();
}

@Override
public void showData(String data) {
    textView.setText(data);
}

mainPresenter.onButtonClick()

    @Override
public void onButtonClick() {
    if (dataSource != null) {
        mainView.showData(dataSource.getReleaseString());
    }
}

dataSource注入MainPresenter

问题是我如何测试这样的东西?我试着模仿dataSource并测试它:

    @Test
public void onButtonGetDataClicked_textViewDisplaysData() {
    when(dataSource.getReleaseString()).thenReturn(MOCK_STRING);

    activityRule.launchActivity(new Intent());

    /** Click Button*/
    onView(withId(R.id.btn_get_data))
            .perform(click());

    onView(withId(R.id.tv_text_data))
            .check(matches(withText(MOCK_STRING)));

}

但这总是给我“RELEASE_STRING”而不是“MOCK_STRING”因此测试总是失败

编辑:注入代码:

    @Before
public void setUp() {

    mockMainView = mock(MainMVP.View.class);
    mainPresenter = new MainPresenter(mockMainView);

    Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
    MockMyApplication applicationContext
            = (MockMyApplication) instrumentation.getTargetContext().getApplicationContext();
    MockDataComponent component = (MockDataComponent) applicationContext.component();
    component.inject(mainPresenter);

}

当然我用

@Inject
DataSource dataSource;

MockDataComponent:

@Singleton
@Component(modules = {MockDataModule.class})
public interface MockDataComponent extends DemoComponent {

void inject(MainPresenter mainPresenter);

}

和MockDataModule:

@Module
public class MockDataModule {

@Provides
public DataSource providesDataSource() {
    return mock(DataSource.class);
}

}

1 个答案:

答案 0 :(得分:1)

您没有在此设置Activity的演示者,因此无法访问模拟数据源。

通过制作Presenter组件,您可以为活动注入演示者,然后此单例演示者可以使用模拟数据源。