DaggerMock 没有在 Espresso 测试中注入 Mock 对象
DaggerMock not injecting Mock objects in Espresso test
在我的 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
此问题已在 0.6.5 版中修复
在我的 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
此问题已在 0.6.5 版中修复