android - 使用 dagger2 进行 Robolectric 测试 Activity

标签 android unit-testing tdd dagger-2 robolectric

我有一个扩展 DaggerAppCompatActivity 的 Activity ,以使用新的 dagger android 注入(inject)工具在其上启用注入(inject)

我正在尝试使用 Robolectric 测试此 Activity ,但测试抛出

java.lang.RuntimeException: android.app.Application does not implement dagger.android.HasActivityInjector

如何禁用 dagger 2 注入(inject)以将 Activity 测试为正常 Activity

测试代码

@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildConfig.class)
public class RegisterActivityTest {

    AppCompatActivity activity;

    @Before
    public void setupActivity() {
        activity = Robolectric.setupActivity(RegisterActivity.class);
    }

    @Test
    public void clickingNewAccountText_MakeNewAccountShouldBeVisible() {
        TextView registerNewAccountTextView = activity.findViewById(R.id.register_sign_up_textView);
        registerNewAccountTextView.performClick();

        Button registerNewAccountButton = activity.findViewById(R.id.register_sign_up_button);
        assertThat(registerNewAccountButton.getVisibility(), is(View.VISIBLE));
    }

}

知道如何解决这个问题

最佳答案

我之前也遇到过类似的问题。您发布的错误似乎表明您的 Activity 正在调用 AndroidInjection.inject(this)。

您是否正在定义自己的应用程序类来实现 HasActivityInjector?

根据Robolectric's documentation

Robolectric will attempt to create an instance of your Application class as specified in the manifest

就我而言,有效的方法是将单元测试配置为包含 Android 资源:

testOptions{
    unitTests{
        includeAndroidResources true
    }
}

在我的模块 build.gradle 中的 android{} 部分下。

关于android - 使用 dagger2 进行 Robolectric 测试 Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48597280/

相关文章:

Android webview 不显示 '%' 字符

unit-testing - 如何在 Jasmine 中使用多个期望

javascript - 如何在 AngularJS 单元测试中模拟 $window.location.replace?

ruby-on-rails - 使用 Rails 学习 TDD 的最佳资源

f# - 将 F# 程序集的 xUnit 测试放在哪里?

android - isGooglePlayServicesAvailable 在 Android 5 中导致 TransactionTooLargeException

java - 改变内容的顺序辅助 Android 开发的 Eclipse

"private"函数的 C 单元测试模拟

c# - 在 C# 中使用 Moq 引发复杂事件

Android图标动画改变颜色