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

简单的匕首单元测试失败

景康安
2023-03-14

我不熟悉匕首。我创建了一个非常简单的单元测试,试图理解我应该如何使用dagger。不幸的是,它失败了。我可能还不了解匕首的一些基本原理。

public class A {
    @Inject
    public B b;

    public B getB() {
      return b;
    }
}

public class B {
}

@Module(injects = { A.class, B.class })
public class DaggerModule {
    @Provides
    public A provideA() {
        return new A();
    }

    @Provides
    public B provideB() {
         return new B();
    }
}

而我的测试课失败了

public class DaggerTest extends TestCase {
    public void testDagger() {
        ObjectGraph theGraph = ObjectGraph.create(new DaggerModule());
        A theA = theGraph.get(A.class);
        assertNotNull(theA.getB());
    }
}

我认为dagger会将B注入A,因为A希望注入B,DaggerModule包含一个@Providers注释方法,该方法创建B。

更新:

我发现当我像这样编写模块类时

@Module(injects = { A.class })
public class DaggerModule {
    @Provides
    public B provideB() {
        return new B();
    }
}

将B注入A作品中。然而,我不理解为什么当模块有一个构造a实例的带注释的方法时,它不起作用。在这种情况下,让注入工作的唯一方法是亲自编写注入,如下所示:

@Module(injects = { A.class, B.class })
public class DaggerModule {
    @Provides
    public A provideA(B b) {
        A theA =  new A();
        theA.b = b;
        return theA;
    }

    @Provides
    public B provideB() {
         return new B();
    }
}

或者在a中创建一个接受B的构造函数,以便编写

@Module(injects = { A.class, B.class })
public class DaggerModule {
    @Provides
    public A provideA(B b) {
        return new A(b);
    }

    @Provides
    public B provideB() {
         return new B();
    }
}

在A中需要一个接受B的构造函数或设置器,这正是我认为使用Dagger可以避免的开销。

所以我做错了什么,还是我误解了匕首的功能?

共有1个答案

公冶阳德
2023-03-14

我注意到了完全相同的行为,即@Provides生成的实例没有注入其@Inject标记的成员。cf匕首

我和你做的完全一样:use@提供了参数注入以转发给构造函数(没有同样的印象,它有点违背dagger的目的)。一旦我有空余时间,我会试着深入一点,看看这是否是一种正常的行为。

 类似资料:
  • 我想学习如何编写JUnit测试,但我完全失败了。 这是我的测试: 问题是这个简单的断言已经失败了。返回的列表是空的。我知道,我对这一切都不熟悉,但是从我的角度来看,失败是如此出乎意料,以至于我没有办法解决这个问题。 以下是全部代码(不太多): 要测试的功能就是这个,我知道它是有效的: 实际上,我只是想学习如何编写这样的测试,但是几天来我一直没有写出来。有相当多的例子和解释,但是不管我做什么尝试,我

  • Android Studio 1.1 添加了单元测试支持,详细请看 Unit testing support。本章的其余部分描述的是 “instrumentation tests”。利用 Instrumentation 测试框架可以构建独立的测试 APK 并运行在真实设备(或模拟器)中进行测试。

  • 英文原文:http://emberjs.com/guides/testing/unit/ 单元测试用于测试代码的一个小片段,确保其功能正常。与集成测试不同,单元测试被限定在一个范围内,并且不需要Ember应用运行。 全局 vs 模块 过去如果没有作为一个全局变量加载整个Ember应用,要对应用进行测试非常困难。通过使用模块(CommonJS,AMD等)来编写应用,可以只加载被测试的部分,而不用将其

  • 单元测试涉及测试软件应用程序的每个单元或单个组件。这是第一级软件测试。单元测试的目的是验证单元组件的性能。 单元是软件系统的单个可测试部分,并在应用程序软件的开发阶段进行测试。 此测试旨在测试隔离代码的正确性。单元组件是应用程序的单独功能或代码。白盒测试方法用于单元测试,通常由开发人员完成。 在测试级别层次结构中,单元测试是在集成和其他剩余测试级别之前完成的第一级测试。它使用模块进行测试,减少了等

  • 单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如 C 语言中单元指一个函数,Java 里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小的被测功能模块。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进

  • 我们从 Hello World 项目入手,增加单元测试功能。 我们新家了一个名为hello-world-test的 Gradle 项目。 环境 Gradle 3.4.1 Spring Boot 1.5.2.RELEASE Thymeleaf 3.0.3.RELEASE Thymeleaf Layout Dialect 2.2.0 Spring Security Test 4.2.2.RELEASE