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

Que*_*ner 7 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()));
    }
}
Run Code Online (Sandbox Code Playgroud)

我还尝试在类中添加一个 ItemsModule ,但结果相同。

use*_*211 14

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

这里详细解释: https: //developer.android.com/training/dependency-injection/hilt-testing#multiple-testrules


Sev*_*ven 6

当我尝试测试不是启动器的活动时,我遇到了同样的错误。我使用的是 Kotlin,但非常相似的东西也适用于 Java。

假设您想要测试MyActivity。首先,您需要将您的活动定义ActivityTestRule为不启动活动:

val targetContext: Context = InstrumentationRegistry.getInstrumentation().targetContext

@get:Rule(order = 0) 
var hiltRule = HiltAndroidRule(this)

@get:Rule(order = 1) 
var testRule = ActivityTestRule(MyActivity::class.java, false, false)
Run Code Online (Sandbox Code Playgroud)

然后,在柄注入后启动您的活动:

@Before fun setup() {
    hiltRule.inject()
    testRule.launchActivity(Intent(targetContext, MyActivity::class.java))
}
Run Code Online (Sandbox Code Playgroud)