gpt4 book ai didi

android - 使用 Espresso 测试 Android Activity 时如何使用 MockContentResolver?

转载 作者:行者123 更新时间:2023-11-29 19:16:44 24 4
gpt4 key购买 nike

我正在使用 Espresso 测试一个 Activity,它显示使用 ContentProvider 检索的数据。

我想使用 MockContentProvider 模拟内容提供者和 MockContentResolver ,但我不知道如何使 Activity 方法 getContentResolver() 返回模拟解析器。

(我可以在执行测试之前插入数据,但我想知道是否可以改用模拟提供程序)

更新:我仍然无法让它工作,所以我包含了一些代码以使其更清晰。

MyActivity.java

MyActivity extends AppCompatActivity {

...

private delete(String id) {
// The method getContentResolver() is what I want to mock when testing
getContentResolver().delete(
Contract.Item.makeUriForItem(id), null, null);
}

...

}

MyActivityTests.java

@RunWith(AndroidJUnit4.class)
@LargeTest
public class StockChartDetailsActivityTests {

@Rule
public ActivityTestRule<MyActivity> myActivityTestRule = new ActivityTestRule<MyActivity>(
MainActivity.class);

@Test
public void test() {

}

}

我无法提出使用 Dagger2 工作的建议,因为 getContentResolver() 是由 android 实现的,我不能使用 @Inject 来注入(inject)我自己的 ContentResolver.

我可以使用不同的策略:

  • 在测试前将数据插入数据库。
  • 有另一层,如业务逻辑层,并将对 getContentResolver() 的调用移至该层中的类,然后我可以注入(inject)(和模拟)业务逻辑类。

但在使用任何这些策略之前,我想知道是否可以使用 MockContentResolver

最佳答案

您应该使用依赖注入(inject)框架。我认为对于 Android 来说,一个不错的选择是 Dagger 2 .

使用 Dagger,您可以在 Activity 中注入(inject)您真正的 Content Provider。在 Activity 中注入(inject)一些东西的常用方法是使用字段注入(inject)(因为你不能直接作用于 Activity 的构造函数:它是由系统创建的)。因此,您可以在 Application 类中实例化 Dagger 模块,并从 Activity 中获取它以注入(inject)自身。像这样的东西:

((MyApplication).getMyComponent()).inject(this);

您的类 MyApplication 将包含如下内容:

MyComponent mMyComponent = DaggerMyComponent.builder()
.appModule(new AppModule(this)) // this is in general useful if you need a Context
.contentProviderModule(new ContentProviderModule())
.build();

当然,它必须包括用于返回模块的 getMyComponent() 方法:

MyComponent getMyComponent() {
return mMyComponent;
}

现在,您的模块已从外部注入(inject)到您的 Activity 中,您可以轻松地注入(inject)其他内容以进行测试:

在/test/文件夹中,使用与 MyApplication 类相同的路径,您可以创建一个扩展 MyApplication 的新类,并创建传递模拟版本的模块的内容提供者。

我无法完成所有步骤,但您可以看一下 here了解更多详情

关于android - 使用 Espresso 测试 Android Activity 时如何使用 MockContentResolver?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43262237/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com