用于UI测试的Hilt依赖注入表示未添加“ HiltAndroidRule”,但

时间:2020-07-09 11:39:16

标签: android dependency-injection dagger-hilt

我正在尝试使用Hilt进行依赖项注入,但是它给出了错误java.lang.IllegalStateException: The component was not created. Check that you have added the HiltAndroidRule.,但添加了HiltAndroidRule:

@RunWith(AndroidJUnit4.class)
@UninstallModules(ItemsModule.class)
@HiltAndroidTest
public class SelectItemActivityTest {

    @Rule
    public HiltAndroidRule hiltRule = new HiltAndroidRule(this);

    @Before
    public void init() {
        hiltRule.inject();
    }
    @BindValue
    List<Item> items = getItems();
    List<Item> getItems()  {
        List<Item> items = new ArrayList<>();
        items.add(new Item(1, "Item1", "", true, true, true));;
        items.add(new Item(2, "Item2", "", true, true, true));;
        items.add(new Item(3, "Item3", "", true, true, true));;
        return items;
    }

    @Rule
    public ActivityTestRule<SelectItemActivity> mActivityRule =
            new ActivityTestRule<>(SelectItemActivity.class);

    @Test
    public void text_isDisplayed() {
        onView(withText("Item1")).check(matches(isDisplayed()));
    }
}

我也尝试过在类内添加ItemsModule,但结果相同。

2 个答案:

答案 0 :(得分:3)

您必须使用RuleChain或通过将order参数应用于Rule注释来包装它。

此处有详细说明:https://developer.android.com/training/dependency-injection/hilt-testing#multiple-testrules

答案 1 :(得分:0)

当我尝试测试不是启动程序的活动时遇到相同的错误。我正在使用Kotlin,但是类似的东西应该适用于Java。

首先,您需要将ActivityTestRule定义为非启动活动:

@Rule @JvmField var testRule = ActivityTestRule(UpgradeRequiredActivity::class.java, false, false)

然后,在注射刀头之后启动您的活动:

@Before fun setup() {
    hiltRule.inject()
    testRule.launchActivity(Intent(targetContext, UpgradeRequiredActivity::class.java))
}