#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 может затем представлять макет источника данных.