当前位置: 首页 > 知识库问答 >
问题:

匕首场注入试验

燕光熙
2023-03-14

我正在使用Dagger 2,在为我的类实现测试时,模块中的generate singleton providers存在一些问题。

class SomeContentProvider extends ContentProvider {

    // this should be normal foo if run by application, 
    // or mocked foo if run by tests
    @Inject Foo foo;

    public Provider() {
        Component.getComponent().inject(this);
    }
}

@Module
class ProviderModule {
    @Singleton
    @Provides
    Foo providesFoo() {
        returns new Foo();
    }
}

@Module
class ProviderTestModule {
    @Singleton
    @Provides
    Foo providesFoo() {
        returns Mockito.mock(Foo.class);
    }
}


public class SomeContentProviderTests extends InstrumentationTestCase {

    @Inject Foo foo; // this should be mocked Foo

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

        MockitoAnnotations.initMocks(this);

        Component.getTestComponent().inject(this);
    }

    public void test1() {
        // needs new instance of Foo when test1 is run from SomeContentProvider
    }

    public void test2() {
        // needs another new instance of Foo when test2 is run from SomeContentProvider
    }
}

所以我有两个问题。

>

  • 我不能使用构造函数注入,因为ContentProvider有一个默认的构造函数。如何从测试模块中获取Foo?

    test1test2中,如何确保在运行每个测试时创建Foo的新实例

    谢谢

  • 共有1个答案

    亢正德
    2023-03-14

    我发现这篇文章对我特别有用。虽然我遇到的问题要复杂得多,但我还是用同样的想法来模拟模块的提供者。

    如何用Dagger 2.0覆盖单元测试中的模块/依赖项?

     类似资料:
    • 我想在单元测试模块中使用我的领域管理器。我做的 然后我想实现 但是realmManager为空。如何使用匕首2编写简单的模块测试?我用了匕首模拟,但没有用。我的模块包含 我尝试了谷歌的一切,但我不知道如何从图形中注入对象。

    • 我正在尝试为我的navControl ler提供匕首柄。但是我使用的方法不起作用。我想提供navControl ler以便通过构造函数注入将其注入我的片段中。 我还创建了FragmentWorks类,以便通过构造函数注入我的依赖项。我知道是这里的问题,但我不知道正确的解决方案… 感谢您的帮助,谢谢! 原因:java.lang.ClassCastException:com.example.app。应

    • 这很好,但是如果我使用全局组件甚至子组件中的一个模块,那么应该传入上下文。因此,这意味着如果我用匕首注入演示器,它将被绑定到ApplicationContext。这使得作为JUnit进行测试变得困难。Android代码不应该在演示器中。 所以我想问的是,最好的做法是只在活动、片段、广播接收器和服务中使用匕首吗?就mvp架构而言,这就是。另一个解决方案是设计另一个dagger组件,但不是与appco

    • 我目前正在尝试将匕首2集成到一个Android应用程序中。我的项目设置如下: 库 应用程序(取决于库) 在我的library项目中,我定义了一个类,以后我将把它注入到库和app项目中需要它的其他类(活动和常规类)中。 我也是这么想的,因为实际上myManager总是空的。很明显,它的构造函数也从来没有被调用过,所以我想我一定遗漏了一些配置方面的东西?或者也许我误解了文档,它根本不是这样工作的?My

    • 我有一个库项目/模块,Android应用程序和普通java应用程序都使用它。在Dagger 1中,此项目/模块具有属性。其中有一个@Inject字段,任何类实现或@Provides方法都不能满足该字段。其想法是强制具有的“顶部”模块提供特定于系统的实现 举个例子:在library项目中,我有一个ActLogin活动,它有字段。此字段的值在登录到服务器时使用。ActLogin由使用此库的多个应用程序

    • 我不熟悉匕首2。我有两个活动,我想使用注入的ViewModel。这是我的ViewModuleFactory: 我的ViewModel模块: 用于映射的我的ViewModelKey: 我的活动模块: 我的AppModule: 我的AppComponent: 我的申请: 在活动中: 它正在注入时引发异常: 有人能帮我识别代码中的问题吗? ................................