在编写espresso测试时如何设置dagger-android 2.15后进行模拟?

时间:2018-04-18 09:44:52

标签: android kotlin mocking android-espresso dagger

如果我们只使用普通匕首2.在application类中,我们将拥有一个保存AppComponent的属性。然后我们可以在espresso测试期间交换它。

但是当我使用dagger-android 2.15设置项目时。如果采用过多的Dagger魔法,事情会变得更加隐含。代码更干净,但测试有点困难。

这是application类:

class App : DaggerApplication() {
    override fun applicationInjector(): AndroidInjector<out DaggerApplication> {
        return DaggerAppComponent
            .builder()
            .create(this)
            .build()
    }
}

这是HomeActivity

class HomeActivity : DaggerAppCompatActivity() {
    @Inject
    lateinit var userPreference: UserPreference

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_home)

        if (!this.userPreference.memberRegistered) {
            goToActivity(EntryActivity::class.java)
        }
    }
}

以此代码为例。如何模拟注入的userPreference.memberRegistered哪个可能是下面的HTTP调用?

3 个答案:

答案 0 :(得分:1)

对于那些对此感兴趣的人,我得到了blog一步一步的细节:

基本上,这个想法是:

  1. 您仍然会在@Module
  2. 中生成注入实例
  3. 但我们将仅为测试
  4. 创建新的@Component A.
  5. 这个@Component将有一个方法来获取@Module
  6. 在测试期间,我们将应用程序使用的@Component与组件A
  7. 交换

    然后事情很简单:

    • 没有DaggerMock

      • 在@Module中,您只需返回mockito mock。
      • ,而不是返回实例
    • 使用DaggerMock

      • 您声明要交换的类型并将其模拟
      • 然后您可以使用模拟。
      • 无需更改@Module

    它通过@AutonomousApps的解决方案激发灵感,但现在你不需要为每个测试类编写@ Component,@ Module。

答案 1 :(得分:0)

尝试了几种方法之后,this是唯一对我有用的方法。

答案 2 :(得分:-1)

I wrote a blog post that explains how to do this just yesterday: https://dev.to/autonomousapps/the-daggerandroid-missing-documentation-33kj

I don't intend to repeat the entire post for this answer (it's hundreds of words and lines of code to properly set up a test harness with Dagger), but to attempt to summarize:

  1. Add a custom application class in the debug source set (I assume it would also work in the androidTest source set, but I have not tried this).
  2. You also need to reference this application in a AndroidManifest.xml in the same source set.
  3. Create a "Test component" in your androidTest class that extends from your production top-level component and build it.
  4. Use that test component to inject your application, which means you've just replaced your entire Dagger dependency graph with a new one you've defined just for the test suite.
  5. Profit.