标签: dagger

在Robolectric测试中覆盖Dagger模块

我正在开发一个Android应用程序,我一直在使用Dagger依赖注入.

我现在正试图测试一个具有这些依赖关系的片段,让我们称之为ProductsService.

在我的Robolectric测试中,我有一个覆盖的测试模块ProductsService:

    @Module(
        includes = ProductsModule.class,
        injects = {
                Fragment.class,
                FragmentTest.class
        },
        overrides = true
)
static class MockProductsModule {
    @Provides
    @Singleton
    public ProductsService providesProductsService() {
        return Mockito.mock(ProductsService.class);
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的测试中,为了运行我的片段,我按如下方式构建它(如此处所示如何使用Robolectric测试片段?)

        FragmentActivity activity = Robolectric.buildActivity(FragmentActivity.class)
            .create()
            .start()
            .resume()
            .get();

    FragmentManager fragmentManager = activity.getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.add(fragment, null);
    fragmentTransaction.commit();
Run Code Online (Sandbox Code Playgroud)

问题是,在创建过程中,它会调用Dagger以满足它的依赖关系:

((MyApplication)getActivity().getApplication()).inject(this);
Run Code Online (Sandbox Code Playgroud)

如何覆盖创建片段时创建的对象图,以便MockProductsModule在我的测试中使用I声明?

android robolectric dagger

9
推荐指数
1
解决办法
2843
查看次数

Robolectric不使用测试应用程序

根据这个链接,我可以创建一个测试应用程序,Robolectric将自动开始在测试中使用.我不能让这个工作.

我使用Dagger进行依赖注入,并为Activity和创建了注入包装类Application.然后我的每个活动都扩展了包装器活动类而不是普通的老类Activity.

我遇到的问题是,在测试中,Application模块提供的依赖关系无法解析,因此测试失败.这是因为我们的大多数测试只是构建一个活动(使用Robolectric.buildActivity())而不是从一个Application.

我希望以某种方式修改Robolectric testrunner来运行我们的测试Application.或者使用上面链接中概述的测试应用程序.

我已经创建了一个测试应用程序,但仍然遇到相同的测试错误,因为测试未在此测试应用程序下运行.我已经尝试将测试应用程序移动到不同的包等,但没有任何改变.

我正在寻找一些关于如何去做我想要的建议.对那些有Dagger经验以及他们如何进行测试的人特别感兴趣.

android robolectric dagger

9
推荐指数
3
解决办法
6413
查看次数

在Gradle的Java插件的compileTestJava中找不到Component of Dagger 2的生成类

好吧,我正在迁移我的Android项目以使用Clean Architecure:

https://github.com/android10/Android-CleanArchitecture

这意味着我的部分代码在域模块中(纯Java,不依赖于Android).对于这个项目,我使用的是Dagger 2,它使用注释处理器生成源代码(在编译期间).

我的项目有以下Gradle配置:

apply plugin: 'java'

sourceCompatibility = 1.7
targetCompatibility = 1.7

configurations {
    provided
}

sourceSets {
    main {
        compileClasspath += configurations.provided
        runtimeClasspath += configurations.provided
    }
    test {
        compileClasspath += configurations.provided
        runtimeClasspath += configurations.provided
    }
}

dependencies {
    def domainDependencies = rootProject.ext.domainDependencies
    def domainTestDependencies = rootProject.ext.domainTestDependencies

    provided domainDependencies.daggerCompiler
    provided domainDependencies.javaxAnnotation

    compile domainDependencies.dagger
    compile domainDependencies.rxJava
    compile domainDependencies.joda

    testCompile domainTestDependencies.junit
    testCompile domainTestDependencies.assertJ
    testCompile domainTestDependencies.mockito
    testCompile domainTestDependencies.jMockLegacy
    testCompile domainTestDependencies.commonsCsv
}
Run Code Online (Sandbox Code Playgroud)

在我的测试源中,我创建了接口TestComponent,并且Dagger用于生成DaggerTestComponent.当我尝试通过命令行或Android Studio构建我的项目时,我收到无法找到符号的编译错误,然后:任务':domain:compileTestJava'的执行失败.

我试图用'compile'和'testCompile'来改变'提供'.它仍然无法正常工作.

奇怪的是,在compileTestJava失败后,我可以在domain/build/classes/test中 …

java android gradle dagger dagger-2

9
推荐指数
1
解决办法
2954
查看次数

Dagger 2模块依赖图:多次绑定

我是Dagger 2的新手,试图将一个(相当)复杂的应用程序移植到它.

我们对'common'库有几个依赖(与其他项目共享).那些"常见"库有时依赖于其他"常见"库.每个库都公开一个模块.

一个例子:

@Module
public class JsonModule {
    @Provides
    public Mapper provideMapper(ObjectMapper objectMapper) {
        return new DefaultMapper(objectMapper);
    }

    @Provides
    public ObjectMapper provideObjectMapper() {
        return ObjectMapperFactory.build();
    }
}
Run Code Online (Sandbox Code Playgroud)

我们的HttpModule依赖于JsonModule:

@Module(includes = {JsonModule.class})
public class HttpModule {
    public HttpHelper provideHttpHelper(ObjectMapper objectMapper) {
        return new DefaultHttpHelper(objectMapper);
    }
}
Run Code Online (Sandbox Code Playgroud)

最后在我的应用程序中,我依赖于这两个模块:

@Module(includes = {JsonModule.class, HttpModule.class})
public class MyAppModule {
    public Service1 provideService1(ObjectMapper objectMapper) {
        return new DefaultService1(objectMapper);
    }

    public Service2 provideService2(Mapper mappper) {
        return new DefaultService2(mappper);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我有一个依赖于我的MyAppModule的组件:

@Component(modules = MyAppModule.class)
@Singleton
public …
Run Code Online (Sandbox Code Playgroud)

dagger dagger-2

9
推荐指数
2
解决办法
5871
查看次数

@gradlew +匕首生成注释

我正在使用gradlew(4.10.2)+ dagger(2.18)遇到一个奇怪的问题。

问题是当我打电话时:

./gradlew :app:compileDebugAndroidTestKotlin 
Run Code Online (Sandbox Code Playgroud)

构建失败并显示:

任务:Common:compileDebugJavaWithJavac FAILED

/CommonModule_ProvidesGsonFactory.java:6:错误:包javax.annotation.processing不存在,请导入javax.annotation.processing。产生 ;

/CommonModule_ProvidesGsonFactory.java:8:错误:找不到符号@ 生成的

但是,如果我从Android Studio运行任务,则该任务成功,并且在匕首生成的类中@Generated 存在。

您是否有一些避免使用@Generated注释的线索./gradlew

java gradle kotlin dagger gradlew

9
推荐指数
3
解决办法
1238
查看次数

Dagger for Android:在调用setContentView后向对象图中注入一个Activity

我想在Android上使用Dagger将一个实例Activity注入另一个类,如下所示:

class PresentationLayer{
    Activity mActivity;

    @Inject
    public PresentationLayer(Activity activity){
        this.mActivity = activity;
    }

    public void presentData(User user){
        ((TextView)mActivity.findViewById(R.id.username))
            .setText(user.getName());
        //...
        //...
    }
}
Run Code Online (Sandbox Code Playgroud)

我能够做的注入,但对所有领域Activitynull在注射时间.

这是我如何进行注射:

Activity本身就是一个模块.

@Module(
    complete = false
)
class MainActivity extends Activity{

    @Override
    public void onCreate(Bundle bundle){
        super.onCreate(bundle);
        setContentView(R.layout.main_activity);
        ObjectGraph objectGraph = CustomApplication.getObjectGraph();
        PresentationLayer pres = objectGraph.get(PresentationLayer.class);
    }

    @Provides Activity provideActivity(){
        return this;
    }


}
Run Code Online (Sandbox Code Playgroud)

这是我的主要模块

@Module(
    entryPoints = PresentationLayer.class,
    includes = MainActivity.class
)
class DaggerModule{
    @Provides PresentationLayer …
Run Code Online (Sandbox Code Playgroud)

java android dependency-injection dagger

8
推荐指数
1
解决办法
1万
查看次数

如何在非Android Gradle Java应用程序中使用Dagger?

Dagger被宣传为"Android和Java的快速依赖注入器".但是我不能让它在没有Gradle'android'插件的情况下运行.

compile 'com.squareup.dagger:dagger:1.2.1'
provided 'com.squareup.dagger:dagger-compiler:1.2.1'
Run Code Online (Sandbox Code Playgroud)

有没有provided在的Java"或"应用" gradle这个插件,我使用.在这个错误报告中甚至提到了.

让它''编译'yelds没有结果.java.lang.IllegalStateException: Module adapter for class ... could not be loaded.抛出同样的东西.

如何使用'java'和'application'来配置使用dagger注释处理器?

java dependency-injection gradle dagger

8
推荐指数
1
解决办法
1597
查看次数

将Dagger2与Lombok一起使用

有没有人将Lombok 1.16与Dagger2一起使用?

我当前的代码如下:

@AllArgsConstructor(onConstructor = @__(@Inject))
public class JuiceMaker {
    private final Apple apple;
Run Code Online (Sandbox Code Playgroud)

错误是:

JuiceMaker cannot be provided without an @Inject constructor or from an @Provides-annotated method.
Run Code Online (Sandbox Code Playgroud)

如果没有Lombok批注,这实际上可以工作,因此:

public class JuiceMaker {
    private final Apple apple;
    @Inject
    public JuiceMaker(Apple apple){
        this.apple = apple
    }
}
Run Code Online (Sandbox Code Playgroud)

作品

lombok dagger dagger-2

8
推荐指数
2
解决办法
1194
查看次数

使用 Hilt 注入 viewModel 时不会调用 init

我想在 ViewModel 初始化时发出 API 请求。这就是为什么我在方法内部发出 API 请求init;期望在init我在 Activity 中注入 viewModel 时被触发。我究竟做错了什么?

MainViewModel.kt

@HiltViewModel
class MainViewModel @Inject constructor(private val mainRepository: MainRepo) : ViewModel() {
companion object {
    var TAG = "MainViewModel**"
}

init {
    Log.d(TAG, "NOT TRIGGERED: ")

    viewModelScope.launch {
        val album1: List<AlbumItem> = mainRepository.getAlbums()
    }
}}
Run Code Online (Sandbox Code Playgroud)

MainActivity.kt

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {

    private val mainViewModel : MainViewModel by viewModels() // injecting viewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding: ActivityMainBinding =
            DataBindingUtil.setContentView(this, R.layout.activity_main)
    } …
Run Code Online (Sandbox Code Playgroud)

android dependency-injection kotlin dagger dagger-hilt

8
推荐指数
1
解决办法
6812
查看次数

Android Dagger ComponentProcessingStep 无法处理

我正在尝试升级旧版本项目以支持SDK 33并在编译时出现此错误。

error: ComponentProcessingStep was unable to process 'com.irokotv.dagger.AppComponent' because 'com.chuckerteam.chucker.api.ChuckerInterceptor' could not be resolved.
  
  Dependency trace:
      => element (CLASS): com.irokotv.logic.dagger.ApiModule
      => element (METHOD): getClient(okhttp3.Interceptor,com.chuckerteam.chucker.api.ChuckerInterceptor)
      => type (EXECUTABLE method): (okhttp3.Interceptor,com.chuckerteam.chucker.api.ChuckerInterceptor)okhttp3.OkHttpClient
      => type (ERROR parameter type): com.chuckerteam.chucker.api.ChuckerInterceptor
  
  If type 'com.chuckerteam.chucker.api.ChuckerInterceptor' is a generated type, check above for compilation errors that may have prevented the type from being generated. Otherwise, ensure that type 'com.chuckerteam.chucker.api.ChuckerInterceptor' is on your classpath.
Run Code Online (Sandbox Code Playgroud)

我已将 kotlin 更新1.3.721.7.10
dagger2.272.48
tools.build:gradle4.0.1 …

android kotlin dagger dagger-hilt

8
推荐指数
1
解决办法
988
查看次数