使用 Espresso 和模拟数据源进行测试失败

Test with Espresso and mocked dataSource fails

我的应用程序中有一个按钮,当用户单击我时,它会显示一个文本。现在我想用 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;

模拟数据组件:

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

void inject(MainPresenter mainPresenter);

}

和模拟数据模块:

@Module
public class MockDataModule {

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

}

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

通过制作 Presenter 组件,您可以为您的 activity 注入 Presenter,然后此单例 Presenter 可以呈现模拟数据源。