我的 Activity 中有范围依赖项,我想用一些模拟来测试该 Activity。我读过有关建议在测试期间用测试组件替换应用程序组件的不同方法,但我想要的是替换活动组件。
例如,我想在 MVP 设置中针对模拟演示者测试活动。
我相信通过在 Activity 上调用 setComponent() 来替换组件是行不通的,因为 Activity 依赖项已经通过字段注入注入了,所以在测试过程中,将使用真实的对象。
我该如何解决这个问题?匕首1呢?是否有同样的问题?
我想将 dagger 库用于 android 库项目。我还研究了 如何在 android 库项目中使用 dagger,但没有得到正确的实现。有人有演示或对此有任何想法吗?我还希望这些库类在项目中扩展以进行一些更改。
我现在正在学习 Dagger 2,在没有代码的情况下解释问题对我来说太痛苦了,所以让我先列出我所有的模块、组件等:
应用程序类
public class App extends Application {
private ApiComponent mApiComponent = null;
private AppComponent mAppComponent = null;
public ApiComponent getApiComponent() {
if (mApiComponent == null) {
// Dagger%COMPONENT_NAME%
mApiComponent = DaggerApiComponent.builder()
// list of modules that are part of this component need to be created here too
.appModule(new AppModule(this)) // This also corresponds to the name of your module: %component_name%Module
.apiModule(new ApiModule(this))
.build();
}
return mApiComponent;
}
public AppComponent getAppComponent() {
if (mAppComponent == null) {
// …Run Code Online (Sandbox Code Playgroud) 我已经使用 Dagger 2 一段时间了,但我仍在尝试解决一些问题。我仍然管理得不好的一件事是为不同情况设置模块和组件,例如具有多个片段的活动。我见过很多实现,大多数时候都有点不同。
那么,让我公开一下我当前使用 MVP 的应用程序结构,如果我的实现是否正确,我想听听一些意见。
@Module
public final class ApplicationModule {
private Context mContext;
public ApplicationModule(Context context){
mContext = context;
}
public ApplicationModule(){
mContext = null;
}
@Provides
Context provideContext(){
return mContext;
}
@Singleton
@Provides
public SharedPreferences getAppPreferences(){
return mContext.getSharedPreferences("CalorieApp",Context.MODE_PRIVATE);
}
}
@Singleton
@Component(modules = ApplicationModule.class)
public interface ApplicationComponent {
void inject(MainApplication mainApplication);
SharedPreferences sharedPreferences();
}
Run Code Online (Sandbox Code Playgroud)
在此 AppModule 中,我通常只会设置我的应用程序需要的 Singleton。就像 SharedPreferences 或与网络请求相关的任何内容。这个模块和组件在某种程度上是标准的,我总是通过这样创建它们来启动我的应用程序。
然后我为 Activity 设置模块和组件,它将依赖于 ApplicationComponent
@Module
public class ActivityModule {
private Activity activity;
public ActivityModule(Activity activity){
this.activity …Run Code Online (Sandbox Code Playgroud) 我正在开发一个使用 Dagger 的现有项目。
这是我第一次尝试使用匕首,我对此有点迷失。
我尝试从现有片段/模块/组件复制所有现有类、接口和其他所有内容,但出现以下错误:
Error:(7, 42) error: cannot find symbol class DaggerDashboardComponent
我尝试Clean Project过Rebuild Project,我尝试过Invalidate Caches and Restart,我从 Android Studio 的编译器设置中启用了注释功能,我尝试关闭项目并重新打开它,但由于某种原因(可能是类生成中的一些错误),我无法编译为dagger 没有生成所需的类。
请在下面找到我创建的所有类/接口:
片段仪表板:
package com.example.app.ui.dashboard;
import com.example.app.R;
import com.example.app.base.AbstractRequestFragment;
import com.example.app.databinding.FragmentDashboardBinding;
import com.example.app.di.component.AppComponent;
import com.example.app.di.component.DaggerDashboardComponent;
import com.example.app.di.module.DashboardModule;
import com.example.app.presenter.dashboard.DashboardPresenter;
import com.example.app.ui.dashboard.DashboardView;
import javax.inject.Inject;
import retrofit2.Call;
/**
* Created by on 31-05-2017.
*/
public class FragmentDashboard extends AbstractRequestFragment<FragmentDashboardBinding> implements DashboardView {
@Inject
DashboardPresenter dashboardPresenter;
@Override
protected int layoutToInflate() {
return R.layout.fragment_dashboard;
}
@Override …Run Code Online (Sandbox Code Playgroud) 我是 Dagger2 依赖注入的新手。当屏幕旋转时,我很难保留相同的组件。
@Inject
MainActivityPresenterImpl presenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
component = DaggerMainActivityComponent.builder()
.mainActivityModule(new MainActivityModule(this))
.applicationComponent(TrainningDagger3.get(this).getComponent())
.build();
component.inject(this);
presenter.fetchData();
}
Run Code Online (Sandbox Code Playgroud)
我尝试调试应用程序,我认为当加载新配置时,它会创建组件的新实例和演示者的新实例。当屏幕旋转时,如何保留相同的组件和演示者。太感谢了!
我正在尝试将singleton存储库注入到Foo类中以使用它。
没有repo注入并且仍然为空,为什么我缺少一些注释或者这不是正确的方法
存储库.java
@Singlton
public class Repository {...}
Run Code Online (Sandbox Code Playgroud)
Foo.java
public class Foo {
@Inject Repository repo;
}
Run Code Online (Sandbox Code Playgroud) 我正在使用 dagger,并且必须更新 中的语言环境attachBaseContext,activity我将语言环境更新逻辑保留在 LocaleManager 中,并且 LocaleManager 实例已经在 appModule 中,当我尝试在 AttachBaseContext 中使用此 LocaleManager 实例时,我得到空指针异常作为活动的注射发生在attachBaseContext内部 之后onCreate()。
在 Android 开发页面的 Dagger 部分,
NetworkModule.classJava 代码的编写方式[NetworkModule::class]与 Kotlin 代码相同。
我认为NetworkModule.class在 Java 中应该NetworkModule::class.java在 Kotlin 中,不是吗?
为什么要使用方括号([])?我认为它与 相同get,但我们为什么需要它?
我在读这个:https : //developer.android.com/training/dependency-injection/dagger-android#java
在“匕首模块”部分,
爪哇代码:
@Component(modules = NetworkModule.class)
public interface ApplicationComponent {
...
}
Run Code Online (Sandbox Code Playgroud)
用 Kotlin 编写的相同代码:
@Component(modules = [NetworkModule::class])
interface ApplicationComponent {
...
}
Run Code Online (Sandbox Code Playgroud) dagger ×10
android ×9
dagger-2 ×4
java ×3
android-mvp ×1
dagger-hilt ×1
kotlin ×1
mvp ×1
retrofit ×1
singleton ×1
unit-testing ×1