【发布时间】:2017-05-13 12:33:52
【问题描述】:
尝试在我的 Espresso 测试中运行 DaggerMock 的实现未成功。我几乎完全复制了示例,但它始终使用MainPresenter 的真实实现,而不是模拟实现。
EspressoRule(完全复制自 real world sample):
public class EspressoDaggerMockRule extends DaggerMockRule<AppComponent>
{
public EspressoDaggerMockRule()
{
super(AppComponent.class, new AppModule(getApp()));
set(new ComponentSetter<AppComponent>()
{
@Override
public void setComponent(AppComponent appComponent)
{
getApp().setComponent(appComponent);
}
});
}
private static App getApp()
{
return (App) InstrumentationRegistry.getInstrumentation().getTargetContext().getApplicationContext();
}
}
浓缩咖啡测试:
public class MainActivityTest
{
@Rule
public EspressoDaggerMockRule rule = new EspressoDaggerMockRule();
@Rule
public ActivityTestRule<MainActivity> mActivityTestRule = new ActivityTestRule<>(MainActivity.class, false, false);
@Mock MainPresenter presenter;
@Test
public void test() throws InterruptedException
{
final MainActivity activity = mActivityTestRule.launchActivity(null);
// presenter in this test class will be mocked but the presenter in activity will be real
Thread.sleep(1000);
}
}
主活动:
public class MainActivity extends BaseActivity implements MainContract.View
{
@Inject MainPresenter mainPresenter;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public void setupComponent(AppComponent appComponent)
{
appComponent
.mainActivityComponentBuilder()
.mainActivityModule(new MainModule(this))
.build()
.inject(this);
}
}
主组件:
@Subcomponent(modules = {MainModule.class})
public interface MainComponent
{
void inject(MainActivity mainActivity);
@Subcomponent.Builder
interface Builder
{
Builder mainActivityModule(MainModule module);
MainComponent build();
}
}
主模块:
@Module
public class MainModule
{
private MainActivity mainActivity;
public MainModule(MainActivity mainActivity)
{
this.mainActivity = mainActivity;
}
@Provides
public MainContract.View mainView()
{
return mainActivity;
}
@Provides
public MainPresenter mainPresenter()
{
return new MainPresenter(mainActivity);
}
}
应用组件
@Singleton
@Component(modules = {AppModule.class})
public interface AppComponent
{
MainComponent.Builder mainActivityComponentBuilder();
}
应用:
public class App extends Application
{
public static AppComponent appComponent;
@Override
public void onCreate()
{
super.onCreate();
setupGraph();
}
private void setupGraph()
{
appComponent = DaggerAppComponent.builder()
.appModule(new AppModule(this))
.build();
}
@VisibleForTesting(otherwise = VisibleForTesting.NONE)
public void setComponent(AppComponent component)
{
appComponent = component;
}
}
示例运行良好。我错过了什么吗?
我已经上传了我在这里尝试的全部源代码:https://github.com/jbmlaird/DaggerMockRepository
【问题讨论】:
标签: android unit-testing dagger-2