Сбой теста с Espresso и mocked DataSource

#android #android-espresso #android-testing

#Android #android-espresso #android-тестирование

Вопрос:

У меня есть кнопка в моем приложении, и когда пользователь нажимает 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. Можете ли вы опубликовать код внедрения datasource? Используете ли вы Dagger для внедрения зависимостей?

2. Как насчет модуля MockDataComponent?

3. @Niko добавил также MockDataComponent и MockDataModule .

4. Вы отладили код, который providesDataSource вызывается из вашего MockDataModule?

5. @Niko ты имеешь в виду этот код: @Override public DataSource get() { return Preconditions.checkNotNull( module.providesDataSource(), "Cannot return null from a non-@Nullable @Provides method"); } откуда MockDataModule_ProvidesDataSourceFactory ?

Ответ №1:

Вы не устанавливаете presenter для своего Activity here, поэтому к mock datasource невозможно получить доступ.

Создание компонента Presenter позволяет вам вводить presenter для вашей активности, и этот одноэлементный presenter может затем представлять макет источника данных.