使用 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 可以呈现模拟数据源。
我的应用程序中有一个按钮,当用户单击我时,它会显示一个文本。现在我想用 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 可以呈现模拟数据源。