标签: dagger

使用Dagger进行Android功能测试

我正在尝试用Mockito和Dagger测试一项活动 .我已经能够在我的应用程序中为Activity注入依赖项,但在测试Activity时,我无法向Activity注入mock.我应该注入Activity来测试还是让getActivity()创建它?

public class MainActivityTest extends
    ActivityInstrumentationTestCase2<MainActivity> {

@Inject Engine engineMock;
private MainActivity mActivity;
private Button mLogoutBtn;


public MainActivityTest() {
    super(MainActivity.class);
}

@Override
protected void setUp() throws Exception {
    super.setUp();

    // Inject engineMock to test
    ObjectGraph.create(new TestModule()).inject(this);
}

@Override
protected void tearDown() {
    if (mActivity != null)
        mActivity.finish();
}

 @Module(
 includes = MainModule.class,
 entryPoints = MainActivityTest.class,
 overrides = true
 )

static class TestModule {
    @Provides
    @Singleton
    Engine provideEngine() {
        return mock(Engine.class);
    }
}

@UiThreadTest
public void testLogoutButton() { …
Run Code Online (Sandbox Code Playgroud)

android dependency-injection functional-testing mockito dagger

12
推荐指数
2
解决办法
5379
查看次数

Android @Singleton上的Dagger 2注释类没有被注入

我目前正在尝试将Dagger 2集成到Android应用程序中.我的项目设置如下:

  • 图书馆
  • 应用程序(取决于库)

在我的库项目中,我定义了一个类,我稍后将其注入到库中的其他需要它的类(活动和常规类)以及应用程序项目中.

@Singleton
public class MyManager{
  @Inject
  public MyManager(){
    //Do some initializing
  }
}
Run Code Online (Sandbox Code Playgroud)

现在 - 例如在我的片段或活动或常规类中,我将按如下方式注入上述Singleton:

public class SomeClass{

  @Inject
  MyManager myManager;
}
Run Code Online (Sandbox Code Playgroud)

或者我想,因为在实践中,myManager总是为空.显然它的构造函数从未被调用过,所以我想我必须错过配置方面的东西?或者我可能误解了文档,但这并不意味着以这种方式工作?MyManager类的目的是成为应用程序范围内可访问的组件累积实体 - 这就是我选择@Singleton的原因.

UPDATE

为了避免混淆:我在评论中提到了我的组件,我认为 - 这是指"基于组件的设计"意义上的组件,与匕首无关.我上面列出了基于匕首的代码 - 我的代码中没有任何与dagger相关的代码.

当我开始添加@Component时,我遇到了一些编译器问题,因为我的dagger2设置不正确 - 请查看这个关于如何正确设置dagger2的真正有用的线程:https://stackoverflow.com/a/29943394/1041533

更新2

这是我更新的代码,基于G. Lombard的建议 - 我更改了代码如下 - 原始的Singleton在库项目中:

@Singleton
public class MyManager{
  @Inject
  public MyManager(){
    //Do some initializing
  }
}
Run Code Online (Sandbox Code Playgroud)

库项目中还有bootstrap类:

@Singleton
@Component
public interface Bootstrap {
    void initialize(Activity activity);
}
Run Code Online (Sandbox Code Playgroud)

然后我在我的活动中使用上面的Bootstrap类(在我的具体应用程序中,而不是在库项目中!但是我在库中也有访问Bootstrap以注入MyManager的类/活动):

public class MyActivity extends Activity{

    @Inject …
Run Code Online (Sandbox Code Playgroud)

java android dagger dagger-2

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

Dagger2错误:必须设置模块

我试图在Dagger2中做SubScoping.但是,我无法弄清楚这个编译错误: - > ...MyApplicationModule must be set发生在我的LogInFragment.如果有人试图对这个错误有所了解.我真的很高兴.

这是MyApplication类:

public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        MyInjector.initialize(this);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是MyInjector类:

public enum MyInjector {
    INSTANCE;

    MyApplicationComponent myApplicationComponent;


    private MyInjector() {
    }

    public static void initialize(MyApplication myApplication) {

        MyApplicationComponent myApplicationComponent = DaggerMyApplicationComponent.builder()
                .myApplicationModule(new MyApplicationModule(myApplication))
                .build();
        INSTANCE.myApplicationComponent = myApplicationComponent;
    }

    public static MyApplicationComponent get() {
        return INSTANCE.myApplicationComponent;
    }

}
Run Code Online (Sandbox Code Playgroud)

这是MyApplicationComponent类:

@Component (modules = {MyApplicationModule.class}) 
public interface MyApplicationComponent { 

}
Run Code Online (Sandbox Code Playgroud)

这是MyApplicationModule类 …

android dagger dagger-2

12
推荐指数
2
解决办法
5728
查看次数

Android studio gradle重复文件dagger编译器

将android studio更新为0.4.0并将gradle插件更新为0.7.1并使用dagger编译器将gradle版本更新为1.9后出现奇怪问题

的build.gradle

android {
packagingOptions {
    exclude 'META-INF/DEPENDENCIES.txt'
    exclude 'META-INF/LICENSE.txt'
    exclude 'META-INF/NOTICE.txt'
}
}
    dependencies {
    compile 'com.android.support:support-v4:+'
    compile 'com.android.support:support-v13:19.0.+'
    compile 'com.google.code.gson:gson:2.2.4'
    compile 'com.squareup.dagger:dagger:1.2.0'
    compile 'com.squareup.dagger:dagger-compiler:1.2.0'
}
Run Code Online (Sandbox Code Playgroud)

在构建中收到此错误

Execution failed for task ':MyApplication:packageDebug'.
Run Code Online (Sandbox Code Playgroud)

在APK META-INF/services/javax.annotation.processing.Processor中复制的重复文件文件1:C:\ Users\Mantas.gradle\caches\modules-2\files-2.1\com.squareup.dagger\dagger-compiler\1.2.0\22633bb84433e03d345a83e7b0c08c66768be30\dagger-compiler-1.2.0.jar文件2:C:\ Users\Mantas.gradle\caches\modules-2\files-2.1\com.squareup.dagger\dagger-compiler\1.2.0\22633bb84433e03d345a83e7b0c08c66768be30 \匕首编译-1.2.0.jar

如果匕首编译器行被评论一切正常

我怎么解决这个问题?谢谢

EDITED 固定的问题,检查 https://plus.google.com/+HugoVisser/posts/7Wr3FcdNVxR

android gradle dagger android-studio

11
推荐指数
1
解决办法
3464
查看次数

Dagger 2没有生成类

我想尝试新的东西并使用Dagger 2作为我的DI框架.所以我在我的项目中有以下pom和"hello world"咖啡机类(http://google.github.io/dagger/).

但是当我做一个mvn干净安装时,没有生成任何类.据我所知,应该有一个"Dagger_CoffeeShop"类生成.嗯......我错过了什么?

<modelVersion>4.0.0</modelVersion>

<groupId>kic</groupId>
<artifactId>xfoo</artifactId>
<version>0.1-SNAPSHOT</version>

<packaging>jar</packaging>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>

<dependencies>
    <dependency>
        <groupId>com.google.dagger</groupId>
        <artifactId>dagger</artifactId>
        <version>2.0-SNAPSHOT</version>
    </dependency>

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.11</version>
        <scope>test</scope>
    </dependency>
</dependencies>


<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <dependencies>
                <dependency>
                    <groupId>com.google.dagger</groupId>
                    <artifactId>dagger-compiler</artifactId>
                    <version>2.0-SNAPSHOT</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>
Run Code Online (Sandbox Code Playgroud)

java maven dagger dagger-2

11
推荐指数
2
解决办法
7060
查看次数

使用注释处理延迟绑定到Dagger2图形

在这个问题中我谈到了Dagger2.Dagger2基本上由组件和模块组成.这是一个例子:

假设我有一个界面:

public interface MyCoolService {
  void run();
}
Run Code Online (Sandbox Code Playgroud)

以及可能的实施:

public class MyCoolServiceImpl {
   @Override
   void run() {}
}
Run Code Online (Sandbox Code Playgroud)

我可以使用Dagger2生成链接实现与接口:

@Component(modules = {MyModule.class})
@Singleton
public interface Component {    
    MyCoolService getMyCoolService();       
}
Run Code Online (Sandbox Code Playgroud)

@Module
public class MyModule {

    @Provides @Singleton
    MyCoolService provideMyCoolService() {
        return new MyCoolServiceImpl();
    }
}
Run Code Online (Sandbox Code Playgroud)

这是Dagger2的简要介绍.现在假设我有以下界面:

public interface MySecondCoolService {
  void doCoolStuff();
}
Run Code Online (Sandbox Code Playgroud)

没有执行MySecondCoolServiceImplMySecondCoolService代码.相反,我有一个标注@JustForCoolStuff字段和方法的注释.我创建了一个Annotation处理器,它收集所有这些Annotations并生成MySecondCoolServiceImpl哪些实现MySecondCoolService.

我是编译器MySecondCoolService在注释处理器运行之前知道新接口的.所以我可以将我的组件更改为:

@Component(modules = {MyModule.class})
@Singleton
public interface Component {    
    MyCoolService …
Run Code Online (Sandbox Code Playgroud)

java dependency-injection guice dagger dagger-2

11
推荐指数
1
解决办法
719
查看次数

Dagger 2:没有@Annex-annotated方法不能提供

我刚刚开始学习dagger2,面对一个看起来像个bug的奇怪问题.这是模块:

@Module
public class SimpleModule {

    @Provides
    Cooker providerCooker() {

        return new Cooker("tom", "natie");
    }
}
Run Code Online (Sandbox Code Playgroud)

零件:

@Component(modules = SimpleModule.class)
public interface SimpleComponent {

    void inject(DaggerTestActivity activity);

}
Run Code Online (Sandbox Code Playgroud)

接口:

public interface CoffeeMaker {

    String makeCoffee();
}
Run Code Online (Sandbox Code Playgroud)

执行:

  public class SimpleMaker implements CoffeeMaker {

        Cooker mCooker;

        @Inject
        public SimpleMaker(Cooker cooker) {

            this.mCooker = cooker;

        }

        @Override
        public String makeCoffee() {

            return mCooker.makeCoffee();
        }
    }
Run Code Online (Sandbox Code Playgroud)

电饭煲:

public class Cooker {

    String name; 
    String coffeeKind;


    public Cooker(String name, String coffeeKind) {
        this.name = …
Run Code Online (Sandbox Code Playgroud)

java android dependency-injection dagger dagger-2

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

IncompleteAnnotationException:dagger.提供缺少的元素类型

当我添加以下代码时出现错误:

@Singleton @Provides fun provideGson() : Gson {
    return Gson()
}
Run Code Online (Sandbox Code Playgroud)

我真的不知道为什么.

java gson kotlin dagger

11
推荐指数
2
解决办法
1998
查看次数

如何将同一个ViewModel实例同时提供给Parent和Child片段

有两个片段:ParentFragment和ChildFragment. ChildFragment已被添加到视图中ParentFragment.

现在使用Dagger2Android有ParentFragmentModule一个方法:

@Provides
fun provideViewModel(fragment: ParentFragment, myViewModelFactory: MyViewModelFactory): MyViewModel {
    return ViewModelProviders.of(fragment, myViewModelFactory).get(MyViewModelImpl::class.java)
}
Run Code Online (Sandbox Code Playgroud)

其中MyViewModelFactory,MyViewModel,MyViewModelImpl是在应用程序中创建的简单ViewModel逻辑.

并且ChildFragmentModule具有以下方法:

@Provides
fun provideViewModel(fragment: ChildFragment, myViewModelFactory: MyViewModelFactory): MyViewModel {
    return ViewModelProviders.of(fragment, myViewModelFactory).get(MyViewModelImpl::class.java)
}
Run Code Online (Sandbox Code Playgroud)

这显然是创建两个单独的实例,ViewModel因为它们接收两个不同的片段实例.

我们如何使它返回相同的实例,以便可以在Parent和Child片段之间共享数据?

我试过传递ParentFragment而不是ChildFragmentChildFragmentModule,但这导致Dagger依赖注入错误.

android dependency-injection mvvm dagger android-viewmodel

11
推荐指数
2
解决办法
5969
查看次数

CoroutineDispatcher 注入时 Hilt 构建失败

不确定为什么构建失败。一切似乎都在受控之中

\n
class MapObjectRepositoryIMPL @Inject constructor(\n    @ApplicationContext context : Context,\n    val mapObjectDao: MapObjectDao,\n    val barrechatNetwork: BarreNetwork,\n    @DefaultDispatcher private val defaultScope: CoroutineContext\n) : MapObjectRepository {\n\n
Run Code Online (Sandbox Code Playgroud)\n
@Module\n@InstallIn(ApplicationComponent::class)\nobject DispatcherModule {\n\n    @DefaultDispatcher\n    @Provides\n    fun providesDefaultDispatcher(): CoroutineDispatcher = Dispatchers.Default\n\n    @IoDispatcher\n    @Provides\n    fun providesIoDispatcher(): CoroutineDispatcher = Dispatchers.IO\n\n    @MainDispatcher\n    @Provides\n    fun providesMainDispatcher(): CoroutineDispatcher = Dispatchers.Main\n}\n\n@Qualifier\n@Retention(AnnotationRetention.BINARY)\nannotation class IoDispatcher\n\n@Qualifier\n@Retention(AnnotationRetention.BINARY)\nannotation class MainDispatcher\n\n@Qualifier\n@Retention(AnnotationRetention.BINARY)\nannotation class DefaultDispatcher\n
Run Code Online (Sandbox Code Playgroud)\n

我收到的错误是这样的,但看起来我正确提供了所有内容,限定符和对存储库类的注入,这很奇怪......

\n
ANTLR Tool version 4.5.3 used for code generation does not match the current runtime version 4.7.1ANTLR Runtime version 4.5.3 used for parser …
Run Code Online (Sandbox Code Playgroud)

android dagger kotlin-coroutines dagger-hilt

11
推荐指数
1
解决办法
3528
查看次数