我试图在继承ActivityInstrumentationTestCase2的Android功能测试中使用Dagger.
设置代码如下所示:
@Override
protected void setUp() {
// TODO Auto-generated method stub
try {
super.setUp();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ObjectGraph.create(new TestModule()).inject(this);
this.activity = super.getActivity();
}`
Run Code Online (Sandbox Code Playgroud)
通过调用触发的OnCreate方法super.getActivity()不使用TestModule提供的类.但是如果我手动运行我的活动(在测试上下文之外),那么我的非测试模块会提供/注入所有相应的类.
我正在尝试测试我正在对我的Android服务进行的一系列更改(android.app.Service) - 我正在使用Dagger和Robolectric,我需要使用一些模拟来替换服务中的字段注入类以减少测试范围. .(稍微)更多'单位'之类的.
我注入Providers.of(Guice语法那里......)到我的android.app.Service.如何在单元测试期间用MockProviders替换它们?
这就是相关服务代码的样子;
@Inject SpotService spotService;
@Inject Provider<SynchroniseTidePosition> syncTidePosition;
@Inject Provider<SynchroniseSwellDataTask> syncBuoyData;
@Inject Provider<SynchroniseConditionsTask> syncConditionsData;
@Inject SpotRatingCalculator spotRatingCalculator;
@Inject LocalBroadcastManager localBroadcastManager;
@Inject NotificationManager notificationManager;
/**
* @see android.app.Service#onCreate()
*/
@Override
public void onCreate() {
super.onCreate();
inject(this);
...
Run Code Online (Sandbox Code Playgroud)
因此,在正常操作下,startService(intent)调用允许服务注入它的依赖关系,onCreate并且我们都很好.
根据我的测试,我想用Mockito模拟替换注入的Providers get()调用.我试图遵循Dagger测试示例并创建一个看起来像这样的测试模块;
@Module(includes = OceanLifeModule.class,
injects = {TestSynchronisationServiceNotifications.class},
overrides = true)
static class TestSynchronisationServiceNotificationsModule {
@Provides LocalBroadcastManager provideLocalBroadcastManager() {
return LocalBroadcastManager.getInstance(Robolectric.application);
} …Run Code Online (Sandbox Code Playgroud) 我正在尝试决定是否使用Transfuse或Dagger进行Android依赖注入.我从未使用过Transfuse,并且对Dagger有基本的了解.非常感谢.
使用Dagger时,有哪些方法可以在也通过注入实例化的对象上自由/简单地实例化@Inject字段.
例如,下面的代码会将类型为Bar的对象注入给定的Foo对象.它将以显示的两种方式之一执行此操作.但是,每个Bar对象的Sly字段与该行为不匹配.
富
public class Foo {
@Inject Bar bar;
public String getValue() {
return "Foo's bar value: " + bar.getValue();
}
}
Run Code Online (Sandbox Code Playgroud)
砰
public class Bar {
@Inject Sly sly;
public String getValue() {
return "Bar's sly value: " + sly.getValue();
}
}
Run Code Online (Sandbox Code Playgroud)
狡猾
public class Sly {
public String getValue() {
return "Hey!";
}
}
Run Code Online (Sandbox Code Playgroud)
模
@Module(
injects = {
Foo.class,
Bar.class
}
)
public class ExampleTestModule {
@Provides
Bar provideBar() {
return new Bar();
}
@Provides
Sly …Run Code Online (Sandbox Code Playgroud) 我有一个属性文件,我想在服务中注入一个属性.
我想像这样使用DI的构造函数方法:
@Inject
public ScanService(@Named("stocks.codes") String codes, IYahooService yahooService) {
this.yahooService = yahooService;
this.codes = codes;
}
Run Code Online (Sandbox Code Playgroud)
我尝试做一个像这个链接中指定的模块=> Dagger:注入@Named字符串?
@Provides
@Named("stocks.code")
public String providesStocksCode() {
return "test";
}
Run Code Online (Sandbox Code Playgroud)
对于我的服务的提供者方法:
@Provides
@Singleton
public IScanService provideScanService(String codes, IYahooService yahooService){
return new ScanService(codes, yahooService);
}
Run Code Online (Sandbox Code Playgroud)
当我运行编译时,我收到此错误:
[ERROR] /Users/stocks/src/main/java/net/modules/TestModule.java:[22,7]错误:上java.lang.String中未注射的成员.你想添加一个注射构造函数吗?通过provideScanService(java.lang.String中,net.IYahooService),用于net.modules.TestModule所需
如何在构造函数中正确注入我的属性?
谢谢.
在Dagger中是否可以执行以下操作:
public abstract class Presenter<T extends BaseView> {
@Inject T mView;
public void showLoadingIndicator() {
mView.showLoading();
}
}
Run Code Online (Sandbox Code Playgroud)
(示例模块)
public class MyModule {
private MyView mView; //extends BaseView
public MyModule(MyView view) {
mView = view;
}
@Provides
public BaseView provideView() {
return mView;
}
}
Run Code Online (Sandbox Code Playgroud)
然后使用上面的模块创建一个对象图并将视图注入演示者?
我的尝试没有奏效(通常会得到"未知类'T'"的错误).我不确定我的配置是否错误或者这是否是不受支持的功能.
我有一些分析包装器,我必须在每个类中创建一个实例,如下所示:
Analytics.create(MyClass.class)
Run Code Online (Sandbox Code Playgroud)
这样构建的对象就可以使用类名来编写更好的事件.
但是为每个类创建这样的对象是非常烦人的(并且容易出错),所以我想到了使用Dagger(或Dagger2).
有没有办法可以将当前类注入已经注入的对象?更好的是,注入命名记录器的好方法是什么?
我正在尝试使用Dagger 2集成Retrofit 2和Android Priority Job Queue.
很可能我在这里使用了错误的花样(我是新来的Java和Android),但我想从将要执行之前系列化然后反序列化对象访问匕首创建的改造实例(Android的作业队列连载持久存储到磁盘的作业).Retrofit实例由Application Dagger组件创建,因为我在其中一个依赖项中使用SharedPreferences.
我无法在创建时将Retrofit传递给作业,因为Retrofit本身无法序列化.
应用程序也无法序列,因此当它运行(因为我不能用我注入无法从工作中引用应用程序组件匕首((MyApplication) myApplication).component().inject(this);就像我可以做的活动,因为应用程序对象不反序列化的工作存在. )
我想使用应用程序其余部分使用的Retrofit实例来提高效率,而不是仅为作业创建另一个实例.它甚至可能吗?
我不确定使用Provider<T>或工厂是否可以提供帮助,因为这是我现在所不能理解的,但如果是这样的话,我会喜欢暗示如何构建事物!
编辑:这是如何使用Android优先级作业队列创建作业.我修改了一个样本,以表明我希望注射方式如何工作.onAdded()在运行之前,作业已序列化并反序列化onRun():
// A job to send a tweet
public class PostTweetJob extends Job {
@Inject MyService webservice;
public static final int PRIORITY = 1;
private String text;
public PostTweetJob(String text) {
// This job requires network connectivity,
// and should be persisted in case the application exits before job is completed.
super(new Params(PRIORITY).requireNetwork().persist());
}
@Override
public void …Run Code Online (Sandbox Code Playgroud) 尝试学习Dagger2并使用Dagger2 2.14.1。我无法过去:
no suitable method found for inject(SettingsFragment)
Run Code Online (Sandbox Code Playgroud)
SettingsFragment是:
public class SettingsFragment extends PreferenceFragmentCompat implements SharedPreferences.OnSharedPreferenceChangeListener {
....
@Override
public void onAttach(Context context){
AndroidInjection.inject(this); <<<< Error here
super.onAttach(context);
}}
Run Code Online (Sandbox Code Playgroud)
因为我无法从DaggerFragment扩展PreferenceFragmentCompat。
我的建筑商模块是
@Module(subcomponents = {SettingsFragmentSubComponent.class, StartupPhotoFragmentSubComponent.class })
public abstract class UIBuildersModule {
@Binds
@IntoMap
@FragmentKey(SettingsFragment.class)
abstract AndroidInjector.Factory<? extends Fragment> bindSettingsFragmentInjectorFactory(SettingsFragmentSubComponent.Builder builder);
// @ContributesAndroidInjector <<< tried also without luck.
// abstract SettingsFragment bindSettingsFragment();
@ContributesAndroidInjector
abstract StartupPhotoFragment bindStartupPhotoFragment();
Run Code Online (Sandbox Code Playgroud)
我确实为SettingsFragment创建了模块和子组件,但它们确实是空的,因为我想获取在应用程序级别创建的依赖项:
@Module
public class SettingsFragmentModule {
}
@Subcomponent(modules = {SettingsFragmentModule.class})
public interface SettingsFragmentSubComponent extends
AndroidInjector<SettingsFragment> …Run Code Online (Sandbox Code Playgroud) 我有这个Dagger 2配置:
AppComponent.kt
@Singleton
@Component(
modules = [
AndroidSupportInjectionModule::class,
AppModule::class,
ActivityBindingModule::class,
]
)
interface AppComponent : AndroidInjector<AppApplication> {
@Component.Builder
abstract class Builder : AndroidInjector.Builder<AppApplication>()
}
Run Code Online (Sandbox Code Playgroud)
ActivityBindingModule.kt
@Module
abstract class ActivityBindingModule {
@ActivityScoped
@ContributesAndroidInjector(
modules = [
MainActivityModule::class,
FragmentModule::class //a fragment factory for each activity
]
)
internal abstract fun mainActivity(): MainActivity
}
Run Code Online (Sandbox Code Playgroud)
MainActivityModule.kt
@Module(subcomponents = [LoginFragmentSubcomponent::class])
abstract class MainActivityModule {
//uncommenting this works fine but Fragment can't be scoped
//@Binds
//@IntoMap
//@FragmentKey(LoginFragment::class)
//abstract fun bindLoginFragment(loginFragment: LoginFragment): Fragment
//...other things which …Run Code Online (Sandbox Code Playgroud) dagger ×10
android ×8
dagger-2 ×4
java ×2
comparison ×1
logging ×1
mvp ×1
properties ×1
transfuse ×1